何をするオプションか
where は Prisma クエリの絞り込み条件を指定するオプションです。SQL の WHERE 句に相当し、findMany / findFirst / update / delete など多くのメソッドで使えます。
// 単純一致
prisma.post.findMany({ where: { status: "published" } });
// 部分一致(大文字小文字を無視)
prisma.post.findMany({
where: { title: { contains: "prisma", mode: "insensitive" } },
});
どんな場面で使うか
- 一覧ページで「カテゴリ」「難易度」などのフィルタを適用するとき
- キーワードでタイトル・本文をまたいで検索するとき
- 論理削除済みレコードを通常クエリから除外するとき(
where: { deletedAt: null })
よくある組み合わせ
OR 条件で複数フィールドを横断検索
prisma.sample.findMany({
where: {
OR: [
{ title: { contains: q, mode: "insensitive" } },
{ summary: { contains: q, mode: "insensitive" } },
],
},
});
undefined を使った動的条件組み立て
条件値が undefined のとき、Prisma はそのフィールドをクエリから除外します。null を渡すと IS NULL 条件になるため、「条件なし」には必ず undefined を使います。
prisma.sample.findMany({
where: {
category: filter.category ?? undefined, // 未指定なら条件なし
difficulty: filter.difficulty ?? undefined,
},
});
orderBy / take との組み合わせ
フィルタ付きページネーションでは where + orderBy + skip / take をセットで使います。
prisma.post.findMany({
where: { status: "published" },
orderBy: { createdAt: "desc" },
skip: (page - 1) * limit,
take: limit,
});
注意点
nullとundefinedを混同しない。undefined→ 条件なし、null→IS NULLORに空配列を渡すと DB によって全件一致または 0 件になる。空チェックを先に行うcontainsは大文字小文字を区別する。英語混在の検索ではmode: "insensitive"を付ける(PostgreSQL のみ対応。SQLite 非対応)OR条件が多いと DB がインデックスを使いにくくなる。フィールド数・件数に応じて全文検索の導入を検討する
関連サンプルの見どころ
- prisma-filter-query:
undefinedスプレッドで動的条件を組み立てるパターン - prisma-keyword-search-query:
ORで複数カラムを横断するキーワード検索パターン - prisma-soft-delete:
deletedAt: nullで論理削除済みを除外するパターン