cakephp3でorder byにcase文を使用する
2021年05月18日
cakephp3で、order by 句にcase文を使用したいケースがあったので、メモです。
今回実装したかったのは以下の内容です。
特定のテーブルから、
(1) あるカラムがAまたはBのグループを先頭に持ってきて
(2) その後に(1)でないグループを表示
(3) (1)(2)が同じ条件場合は、別のカラムの値降順で表示
以下のような実装で実現できました。
// モデルでの実装の例
$query = $this->find();
// CASE WHEN ((カラム名 = A) or (カラム名 = B)) THEN 1 ELSE 2 END
$case = $query->newExpr()
->addCase(
$query->newExpr()->add([
'OR' => [
'カラム名' => A,
'カラム名' => B
]
]),
[1, 2],
['integer', 'integer']
);
$query->order([
$case,
カラム名 => 'DESC'
]);
/* これで、
select * from table order by (CASE when (カラム名 = A or カラム名 = B) THEN 1 ELSE 2 END), カラム名 DESC
と同じものが実行できました
*/