バグ解消法、お役立ち情報など

CakePHPでCASE文を使う方法

logo

はじめに

この記事では、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クラスのインスタンスを作成し、引数にカラム名を指定するということです。

こうすることでクエリビルダーがカラムを動的に切り替えてくれるようになります。

バグ解消法、お役立ち情報など