Prismaでリレーション先のデータもSELECTしたい場合のパラメータ覚書

「投稿データを取得した際に、著者データもSELECTしたい」のような、リレーション先のデータもSELECTしたい場合の操作メモです。

Prismaでリレーション先のデータを取るシンプルな方法

クイックスタートなどで紹介されている方法は、includeでの指定です。

    const posts = await prisma.post.findMany({
        include: {
            categories: {
                include: {
                    category: true
                }
            },
            author: true,
        }
    })

この場合、authorcategories, categoryのデータ丸ごと取得します。SELECT * FROM ~みたいなイメージですね。

取得したいカラムを明示的に指定する場合は、includeではなくselectを使う

includeではなくselectを使うと、カラムの指定ができるらしいです。

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

実行すると、このようなデータが取れます。

[
   { title: 'voluptatem', id: 5, author: { name: 'Norbert' } },
   {
     title: 'Quia dignissimos deleniti numquam consequuntur. Labore eaque dolorem in animi et reiciendis. Nisi rerum delectus voluptates et repellendus.\n' +
       'Quae dolorem tempora. Consequatur eligendi fugiat cum in. Amet inventore eaque voluptate. Excepturi aliquid harum expedita alias quas dolorem qui ratione officia. Sit sed ab explicabo ab nihil. Quod neque qui.\n' +
       'Quia error qui quo vel eius. Velit vel laudantium. Ut architecto quia. Ut dolorum similique et. Delectus aspernatur nisi ut eaque architecto harum sunt voluptatibus laudantium. Molestias nemo voluptatum consequatur praesentium est non labore enim dolorum.',
     id: 6,
     author: { name: 'Roger' }
   },
   { title: 'debitis', id: 7, author: { name: 'Javonte' } }
 ]

余談: includeselectは併用できない

あるのかわからないユースケースですが、「リレーション先は丸ごとデータ取りたいけど、元テーブルのはSELECTしたい」みたいな場合はselectincludeを併用したくなります。

が、両方を引数に渡すとエラーが出ます。

"Please either choose select or include."

selectを使いたい場合は、全データselect側で指定しましょう。

参考

https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#select-specific-relation-fields
Comment