Prisma / TypeORM

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

使う機会がありそうだなと思ったので、今分かる範囲での実装方法の覚書です。 あまりいい方法が思いつかなかったので、半年とかしたら別の方法にしているかも・・・? findManyでは、NOTを使う 直感的には、NOT NUL […]

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

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

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

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
                        }
                    }
                }
            }
        }
    })

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

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

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

Related Category posts