26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【CakePHP】バーチャルフィールド

Last updated at Posted at 2015-01-24

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;
26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?