API / Option

where

Prisma クエリで絞り込み条件を指定するオプション。完全一致・部分一致・複数条件(AND / OR)など様々なフィルタを組み立てられる。

prismafiltersearchquerywhere
所属:Prisma Client

代表的な値 / 使い方

  • where: { status: 'published' }
  • where: { title: { contains: keyword, mode: 'insensitive' } }
  • where: { AND: [{ category: cat }, { difficulty: diff }] }
  • where: { OR: [{ title: { contains: q } }, { body: { contains: q } }] }

注意点 / Pitfalls

  • ·条件が undefined の場合 Prisma は its フィールドを無視するが、null を渡すと IS NULL 条件になるため混在に注意
  • ·OR 条件が多くなると DB がインデックスを使いにくくなりパフォーマンスが低下する場合がある
  • ·contains による部分一致は大文字小文字を区別するため、日本語・英語混在時は mode: 'insensitive' の適用を検討する
  • ·動的に条件を組み立てる際、空配列を AND / OR に渡すとすべてのレコードに一致するか 0 件になる(DB によって異なる)

一緒に使う項目

補足

条件が存在しない場合は undefined を渡すと Prisma がそのフィールドをクエリから除外するため、動的な条件組み立てに便利。orderBy / skip / take と組み合わせてフィルタ付きページネーションを実装するパターンが多い。

何をするオプションか

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

注意点

  • nullundefined を混同しない。undefined → 条件なし、nullIS NULL
  • OR に空配列を渡すと DB によって全件一致または 0 件になる。空チェックを先に行う
  • contains は大文字小文字を区別する。英語混在の検索では mode: "insensitive" を付ける(PostgreSQL のみ対応。SQLite 非対応)
  • OR 条件が多いと DB がインデックスを使いにくくなる。フィールド数・件数に応じて全文検索の導入を検討する

関連サンプルの見どころ

  • prisma-filter-query: undefined スプレッドで動的条件を組み立てるパターン
  • prisma-keyword-search-query: OR で複数カラムを横断するキーワード検索パターン
  • prisma-soft-delete: deletedAt: null で論理削除済みを除外するパターン

関連ドキュメント

関連サンプル

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