LaravelでDBのデータを順位付けしたいときってありますよね!
僕はありました!
順位取得SQL
まずSQLの準備です。
データの順位は下記のSQLで取得できます。
rank.sql
SELECT id,
score,
(SELECT count(score)
FROM summaries as b
WHERE a.score < b.score) + 1 as rank
FROM summaries as a
WHERE a.score IS NOT NULL
ORDER BY rank ASC
この副問合せをLaravelのクエリビルダで書き直します。
Laravel副問合せ構文
副問合せはそのままDB::raw()
で書くのがいいっぽいです。
DB::table('table')
->select(
DB::raw(
('select文')
)
)
->get();
参考: Laravel - How to make subquery in select statement?
これで準備が整いました。
実際のORM
SummaryRepository.php
public function getRanks()
{
return DB::table('summaries as a')
->select(
'id',
'score',
DB::raw(
"(select count(score) FROM summaries b WHERE a.score < b.score) + 1 as rank"
)
)
->whereNotNull('a.score')
->orderBy('rank', 'ASC')
->get();
}
->get()
を->toSql()
に変更して生成されたSQLを確認すると上述のSQL文が発行されていることがわかります。
これでDBから順位付けされたデータが取得できます!めでたし。