No.346
【CakePHP3】カラムを結合して検索する
SQL関数を使いたい場合
Ver.3になって大きく変わったCakePHP3。特に大きな変更なのがクエリビルダで、これに慣れないためにCakePHP2を使い続けている人もいると聞く。
個人的に最も大きく変わったと感じるのがSQL関数の取り扱いだ。
以前は配列のキーや値にそのまま関数を書き込んでいたが、CakePHP3ではクエリビルダに用意されているSQL関数を使うようになっている。
抽象化された結果データーベースのプラットフォームへの異存が無くなるので、これはこれで正しい進化なのだろう。
CakePHP3の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);
});
作成されるクエリは同じなのでお好みで。個人的には後者が好き。