🪺

Drizzle ORM の sql`` はネストできる

2025/03/10に公開

割と当たり前なのかもしれないけど、実際に試してみるまで知らなかった。(公式ドキュメントに書いてないんだもん…)
なので、こういうふうに頻出のロジックを関数に切り出せる。

function sqlResourceVisibleTo(userId: number | null) {
  return userId != null
    ? sql`${resources.deletedAt} IS NULL AND (${resources.public} = TRUE OR ${resources.userId} = ${userId})`
    : sql`${resources.deletedAt} IS NULL AND ${resources.public} = TRUE`;
}

async function getResourceById(resourceId: number, loggedInUserId: number | null) {
  return await db.query.resources.findFirst({
    columns: {
      name: true,
    },
    where: sql`${resources.id} = ${resourceId} AND ${sqlResourceVisibleTo(loggedInUserId)}`,
  });
}

本当にサポートされてるやり方かちょっと悩んだけど、eq とか not の expressions ユーティリティが sql`` で実装されている 上、公式ドキュメントに not(eq(...)) という使い方が紹介されている 以上想定してないということはなさそう。

Discussion