何をするオプションか
orderBy は Prisma クエリの結果の並び順を指定するオプションです。"asc"(昇順)または "desc"(降順)で並び替えます。
// 新着順
prisma.post.findMany({ orderBy: { createdAt: "desc" } });
どんな場面で使うか
- 一覧ページで「新着順」「人気順」「アルファベット順」を切り替えるとき
- ページネーションで、ページをまたいでもレコードの順序が崩れないようにしたいとき
- リレーション先のフィールドや集計値でソートしたいとき
よくある組み合わせ
複数フィールドのソート(優先順位付き)
複数フィールドを指定する場合は配列で渡します。オブジェクトの key 順は JavaScript では保証されないため、配列を使います。
prisma.post.findMany({
orderBy: [
{ viewCount: "desc" }, // まず viewCount の多い順
{ createdAt: "desc" }, // 同じ viewCount なら新着順
],
});
ページネーションとのセット使い
skip / take と組み合わせる場合は必ず orderBy を指定します。orderBy がないと DB がレコードを任意の順で返すため、ページをまたいで重複や欠落が生じる可能性があります。
prisma.post.findMany({
where: { status: "published" },
orderBy: { createdAt: "desc" },
skip: (page - 1) * limit,
take: limit,
});
リレーション先フィールドでソート
prisma.post.findMany({
orderBy: { author: { name: "asc" } }, // 著者名順
});
注意点
- ページネーションでは、ソートキーに一意なフィールド(
idなど)を最後に追加すると安定ソートになる。createdAtだけだと同一タイムスタンプのレコードで順序が変わる場合がある - リレーション先フィールドでのソートは JOIN を伴うためパフォーマンスに影響する場合がある
null値の並び順は DB ごとにデフォルトが異なる。明示したい場合は{ sort: "desc", nulls: "last" }のオブジェクト形式で指定するenumフィールドの並び順は DB の collation に依存する
関連サンプルの見どころ
- prisma-sort-query: 単一・複数・リレーション先フィールドのソートパターン一覧
- prisma-pagination-query:
orderBy+skip/takeの安定ソートパターン - prisma-filter-query:
where+orderByを組み合わせたフィルタ付き一覧