API / Option

include

Prisma クエリでリレーション先モデルを一緒に取得するオプション。JOIN 相当の操作をシンプルに書ける。

prismaqueryrelationjoininclude
所属:Prisma Client

代表的な値 / 使い方

  • include: { author: true }
  • include: { posts: { where: { published: true }, orderBy: { createdAt: 'desc' } } }
  • include: { _count: { select: { posts: true } } }

注意点 / Pitfalls

  • ·include と select は同一クエリの同一レベルで併用できない(どちらかを選ぶ)
  • ·include: { relation: true } はリレーション先の全フィールドを取得するため、大きなモデルでは over-fetching になりやすい
  • ·深いネストの include はクエリが複雑になりパフォーマンスに影響する場合がある
  • ·N+1 問題: ループ内で個別に include クエリを実行するのではなく、1 クエリで include する

一緒に使う項目

補足

include はリレーション全フィールド取得、select は指定フィールドのみ取得。リレーション先のフィールドを絞りたい場合は include の代わりに select + ネスト select を使う。_count でリレーションの件数集計も可能。

何をするオプションか

include は Prisma クエリでリレーション先モデルを一緒に取得するオプションです。SQL の JOIN 相当の操作をシンプルに書けます。

// 投稿と著者を一度に取得
prisma.post.findMany({
  include: { author: true },
});

どんな場面で使うか

  • 投稿一覧に著者名を表示したいとき(N+1 を避けるため 1 クエリにまとめる)
  • 親レコードと子レコードを同時に扱いたいとき
  • リレーション件数(_count)を集計したいとき

よくある組み合わせ

リレーション先に条件・ソートを付ける

include の中でも whereorderBy が使えます。

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 です。

注意点

  • includeselect は同一クエリの同一レベルで併用できない
  • include: { relation: true } はリレーション先の全フィールドを取得するため、大きなモデルでは over-fetching になりやすい。フィールドを絞るにはネスト select に切り替える
  • ループ内で 1 件ずつ include クエリを実行すると N+1 問題になる。ループの外で 1 クエリにまとめること
  • 深いネスト(3 段以上)はクエリ生成が複雑になり、パフォーマンスへの影響も出やすい

関連サンプルの見どころ

  • prisma-relation-query: includeselect の切り替えパターン、_count 活用
  • prisma-sort-query: include でリレーション先フィールドを使ってソートするパターン

selectinclude の違いを比較でまとめたページもあります → select vs include

関連ドキュメント

関連サンプル

同じテーマや技術スタックを使った実装例