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

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

広告ここから
広告ここまで

目次

    「<カテゴリー名>のカテゴリを含む投稿記事」のように、リレーション先のデータが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)

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

    参考リンク

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark