CakePHPが発行するSQLのselectカラムを自作することができる。
##使い方
モデルのフィールドへ「カラム名=>select句の式」で設定する。
モデルへバーチャルフィールドを定義
class User extends AppModel{
$virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];
もちろん、動的に設定することもできる。
$this->モデル->virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];
findするときに、virtualFieldsで設定したカラム名を指定する。
$this->find('all',[
'fields'=>['name']
]);
##便利な使い方
fieldsにSQL関数を書いた場合、モデル名の下にSQL関数の結果が入らない。
通常
$res = $this->find('all',[
'fields'=>['id','concat(User.first_name, " ", User.last_name) as name']
]);
var_dump($res);
/*
[0] => Array
(
[User] => Array
(
[id] => 12
)
[0] => Array
(
[name] => suzuki taro
)
)
*/
バーチャルフィールド使えば、モデルの下に結果が入りデータを扱いやすくなる。
便利な使い方
$this->virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];
$res = $this->find('all',[
'fields'=>['id','name']
]);
var_dump($res);
/*
[0] => Array
(
[User] => Array
(
[id] => 12
[name] => suzuki tarou
)
*/
※ちなみに、userテーブルのように名字と名前を別のカラムで管理している場合、virtualFieldsを使ってconcatで名字と名前の結合すると便利。
##動的なバーチャルフィールドの設定
###動的に設定
動的に設定
$this->モデル->virtualFields = ['name' => 'concat(User.first_name, " ", User.last_name)'];
###動的に解除
動的に解除
$this->モデル->virtualFields = null;