Prismaでリレーション先のレコードが存在するレコードのみ取得するWHEREクエリを作る覚書

使う機会がありそうだなと思ったので、今分かる範囲での実装方法の覚書です。

あまりいい方法が思いつかなかったので、半年とかしたら別の方法にしているかも・・・?

findManyでは、NOTを使う

直感的には、NOT NULL相当を書けばいけそうな気がしました。

    const posts = await prisma.post.findMany({
        where: {
            NOT: {
                categories: undefined
            }
        },
        include: {
            categories: true
        }
    })

が、これだと多対多の場合、[]でデータがとれます。

[
{
     id: 7,
     title: 'debitis',
     content: 'Omnis iste quas sed et qui itaque quod voluptas. Consequatur consequatur adipisci culpa ea quas quia fugit. Corporis temporibus et unde voluptatem. Eveniet non minima molestias libero qui illum earum quia.\n' +
       'Praesentium facere eum. Mollitia natus consequuntur eum suscipit officiis perferendis nobis in numquam. Modi sed occaecati.\n' +
       'Excepturi maiores accusantium. Voluptas molestias et quod reprehenderit modi pariatur. Vitae consequatur possimus delectus.',
     published: true,
     published_at: 2022-05-26T13:32:55.168Z,
     authorId: 11,
     categories: []
   }
]

このレコードは取りたくないので、他の方法にします。

Relation先の主キー相当を指定する

現状これかなぁという方法は、主キーを判定に使う方法です。


    const posts = await prisma.post.findMany({
        where: {
            NOT: {
                categories: {
                    none: {
                        categoryId: undefined
                    }
                }
            }
        },
        select: {
            id: true,
            categories: {
                select: {
                    category: {
                        select: {
                            name: true
                        }
                    }
                }
            }
        }
    })

これなら上述のコードで取れてしまっていたレコードを除外できます。

Comment