Prismaで、リレーション先のデータに対する`WHERE`クエリを作る

「<カテゴリー名>のカテゴリを含む投稿記事」のように、リレーション先のデータがWHERE句に入るSELECTを実行したい場合、whereをネストさせます。

1対1のリレーションでクエリを作る場合

1対1の場合は、シンプルにネストさせます。


    const posts = await prisma.post.findMany({
        where: {
            author: {
                id: {
                    equals: 10
                }
            }
        },
        select: {
            title: true,
            author: {
                select: {
                    id: true,
                    name: true
                }
            }
        }
    })

多対多など、複数アイテムがある場合のクエリを作る場合

複数アイテムがある場合、直感的には配列を使いたくなりますが、Prismaのクエリではすこし異なる書き方です。


    const posts = await prisma.post.findMany({
        where: {
            categories: {
                some: {
                    category: {
                        name: {
                            contains: 'Do'
                        }
                    }
                }
            }
        },
        select: {
            title: true,
            categories: {
                select: {
                    category: {
                        select: {
                            name: true
                        }
                    }
                }
            }
        }
    })

none, some, everyの3種類で複数アイテムがある場合のクエリを定義します。

自分の理解では、以下の使い分けになると考えています。

  • none: 以下の条件に該当しないアイテム (NOT)
  • some: 以下の条件のどれかに該当するアイテム (OR)
  • every: 以下の条件のすべてに該当するアイテム(AND)

組み合わせたクエリを作りたい場合の実装は、もうちょっと調べてからまとめます。

参考リンク

Comment