何をするオプションか
include は Prisma クエリでリレーション先モデルを一緒に取得するオプションです。SQL の JOIN 相当の操作をシンプルに書けます。
// 投稿と著者を一度に取得
prisma.post.findMany({
include: { author: true },
});
どんな場面で使うか
- 投稿一覧に著者名を表示したいとき(N+1 を避けるため 1 クエリにまとめる)
- 親レコードと子レコードを同時に扱いたいとき
- リレーション件数(
_count)を集計したいとき
よくある組み合わせ
リレーション先に条件・ソートを付ける
include の中でも where や orderBy が使えます。
prisma.user.findMany({
include: {
posts: {
where: { published: true },
orderBy: { createdAt: "desc" },
take: 5,
},
},
});
_count でリレーション件数を取得
prisma.user.findMany({
include: {
_count: { select: { posts: true } },
},
});
select との役割の違い
include: { author: true } は著者の全フィールドを返します。著者の name だけほしい場合は include ではなく select + ネスト select を使います。
// include: 著者の全フィールドが返る
include: { author: true }
// select + ネスト: name だけに絞れる
select: {
id: true,
title: true,
author: { select: { name: true } },
}
include を使うか select を使うかは「通常フィールドも全部必要か」で判断します。通常フィールドが必要なら include、絞りたいなら select です。
注意点
includeとselectは同一クエリの同一レベルで併用できないinclude: { relation: true }はリレーション先の全フィールドを取得するため、大きなモデルでは over-fetching になりやすい。フィールドを絞るにはネストselectに切り替える- ループ内で 1 件ずつ
includeクエリを実行すると N+1 問題になる。ループの外で 1 クエリにまとめること - 深いネスト(3 段以上)はクエリ生成が複雑になり、パフォーマンスへの影響も出やすい
関連サンプルの見どころ
- prisma-relation-query:
includeとselectの切り替えパターン、_count 活用 - prisma-sort-query:
includeでリレーション先フィールドを使ってソートするパターン
select と include の違いを比較でまとめたページもあります → select vs include