何をするオプションか
select は Prisma クエリで取得するフィールドを明示的に指定するオプションです。省略すると全フィールドが返りますが、select を使えば必要な列だけに絞れます。
// id と title だけを取得
prisma.post.findMany({
select: { id: true, title: true },
});
どんな場面で使うか
- API レスポンスに含めるフィールドを最小限に抑えたいとき
- パスワードハッシュや機密フィールドを誤って返さないようにしたいとき
- リレーション先から特定フィールドだけ取得したいとき(ネスト
select)
よくある組み合わせ
リレーション先のフィールドを絞る(ネスト select)
prisma.post.findMany({
select: {
id: true,
title: true,
author: {
select: { name: true }, // リレーション先も絞れる
},
},
});
include: { author: true } だと著者の全フィールドが返りますが、ネスト select なら name だけに絞れます。
_count でリレーション件数を取得
prisma.user.findMany({
select: {
id: true,
name: true,
_count: { select: { posts: true } }, // 投稿数だけ
},
});
include との違い
select | include | |
|---|---|---|
| 通常フィールド | 指定したものだけ | すべて返る |
| リレーション | ネスト select で絞れる | 全フィールドが返る |
| 同一レベルでの併用 | 不可(どちらか一方) | 不可(どちらか一方) |
リレーション先のフィールドも絞りたい場合は include ではなく select + ネスト select を選びます。
注意点
includeとselectは同一クエリの同一レベルで併用できない。TypeScript の型エラーで気づけるselectを使うと戻り値の型が自動的に絞り込まれる。型が複雑になる場合はPrisma.PostGetPayload<{ select: ... }>で明示する- ネストが深い
selectはクエリが読みにくくなる。深さ 2 段を超えたら関数や型エイリアスに切り出す
関連サンプルの見どころ
- prisma-relation-query:
selectとincludeの使い分けをモデルで比較するパターン - prisma-keyword-search-query:
selectでレスポンスフィールドを最小化するパターン - prisma-sort-query: Route Handler での
select+orderByの組み合わせ
select と include の違いを比較でまとめたページもあります → select vs include