🪺
Drizzle ORM の sql`` はネストできる
割と当たり前なのかもしれないけど、実際に試してみるまで知らなかった。(公式ドキュメントに書いてないんだもん…)
なので、こういうふうに頻出のロジックを関数に切り出せる。
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