Drizzle ORMでオプショナルな値を元に検索条件を指定する方法

はじめに

DBのレコードを取得する際、基本的には全件を取得するが、オプショナルな引数が指定されている場合はその値を条件として検索したい。というケースがあるかと思います。
ORMとしてDrizzle ORMを使っている場合にそのような処理を書く良い感じの方法が公式のドキュメントからは見つけられなかったので、調べて見つけたやり方をメモしておこうと思います。

環境

  • macOS Sonoma 14.4.1
  • Node.js v20.10.0
  • npm 10.2.3
  • drizzle-orm 0.30.9
  • PostgreSQL 15.5

実装

以下のGitHubのコメントの通りに実装すればOKです。

github.com

async function find(params?: Partial<{ id: string }>) {
  const conditions: SQL[] = [];
  if (params) {
    if (params.id) {
      conditions.push(eq(records.id, params.id));
    }
    // パラメーターが複数ある場合は順次conditionsに追加していく
  }

  const result = await db
    .select({
      id: records.id,
      text: records.text,
    })
    .from(records)
    .where(and(...conditions)); // 複数の条件をandで展開する
  return result;
}

条件として指定したい値が渡された場合はクエリの条件をリストに追加し、whereの条件としてandとして展開することでオプショナルな値で検索ができます。