No.346


【CakePHP3】カラムを結合して検索する

SQL関数を使いたい場合

 Ver.3になって大きく変わったCakePHP3。特に大きな変更なのがクエリビルダで、これに慣れないためにCakePHP2を使い続けている人もいると聞く。

 個人的に最も大きく変わったと感じるのがSQL関数の取り扱いだ。
 以前は配列のキーや値にそのまま関数を書き込んでいたが、CakePHP3ではクエリビルダに用意されているSQL関数を使うようになっている。
 抽象化された結果データーベースのプラットフォームへの異存が無くなるので、これはこれで正しい進化なのだろう。


CakePHP3のSQL関数

 関数の種類や細かい説明は公式サイトを見てもらうとして

クエリービルダー SQL関数を使う

 例えばcountカラムとしてCOUNT関数の結果を取得したければ以下のように記述すれば良い。

$query->select(['count' => $query->func()->count('*')]);

likeなどと組み合わせてSQL関数を使用したい場合

 SQL関数を組み合わせた上で処理を行うことは多い。
 例えばよくあるパターンとして「複数のカラムを結合したうえでlikeで部分一致検索を行う」がある。

 そういう場合は無名関数を使って処理してあげればいい。

$query->where(function ($exp, $query) use ($keyword) {
  $concat = $query->func()->concat([
    'column1' => 'identifier',
    'column2' => 'identifier'
  ]);
  return $exp->like($concat, $keyword);
});

 where句とconcat関数を分けたければ下記のように書くことも可能。

$concat = $query->func()->concat([
  'column1' => 'identifier',
  'column2' => 'identifier'
]);
$query->where(function ($exp, $query) use ($concat) {
  return $exp->like($concat, $keyword);
});

 作成されるクエリは同じなのでお好みで。個人的には後者が好き。