CakePHPでCASE文を使う方法
はじめに
この記事では、SQLのCASE文をCakePHPのクエリビルダーで使う方法をご紹介します。
想定する状況
以下のような状況を想定します。
a.is_admin
の値によってセレクトするカラムを変えたいa.is_admin
=true
なら、a.admin_id
- それ以外は
b.user_id
状況によってセレクトするカラムを動的に変えたい、という場合です。
実装
実装は以下のようになります。
use Cake\Database\Expression\IdentifierExpression; ... $idCase = $query->newExpr()->addCase( [$query->newExpr()->add(['a.is_admin' => true])], [ new IdentifierExpression('a.admin_id'), new IdentifierExpression('b.user_id'), ], ['string', 'string'] ); $query->select([ 'user_id' => $idCase, ]);
上記コードによって、以下のようなSQLが生成・実行されます。
( CASE WHEN a.is_admin = '1' THEN a.admin_id ELSE b.user_id END ) AS `user_id`,
上記のサンプルコードは以下のような場合を想定しています。
- ユーザーIDとして
b.user_id
カラムをセレクトしたい - ただし、管理者の場合は
a.admin_id
を ユーザーIDとしてセレクトしたい
ポイントは、IdentifierExpression
クラスのインスタンスを作成し、引数にカラム名を指定するということです。
こうすることでクエリビルダーがカラムを動的に切り替えてくれるようになります。