CodeLab技術ブログ

プログラミング技術まとめ

virtualFieldsで Column not found: 1054 Unknown columnになる場合

CakePHP2系で実装されているvirtualFieldsはすごい便利だけど問題もある。


virtualFieldsは複数のカラムを合体させたり、合計の値などを入れる際に便利
たとえば

public $virtualFields = array(
    'name' => 'CONCAT(User.first_name, " ", User.last_name)'
);

というような感じにすると、姓名を合体したnameフィールドができ、これはテーブルにあるほかのフィールドと同様の扱いで検索やソートが可能です。
実は、belongsToで指定されたカラムも指定可能で、例えばUserModelにprefecture_idがあるとすると

public $virtualFields = array(
    'prefecture_name' => 'Prefecture.name'
);

てな感じにするとUserモデルに都道府県名も一緒に出てきます。

Userモデルを読んでいる場合は大丈夫なんだけど、ほかのモデルから間接的にUserモデルにコールがかかるとUnknownになってしまいます。
なぜかrecursive=2とかにしても解決できません。明示的にUserModelをunbindするしかないようです。

というわけで、モデルに別モデルを参照したvirtualFieldsを書くのはお勧めしません。
ただ動的に指定することもできるので、使うときだけコントローラーからvirtualFieldsを追記するようにしたほうがよさそうです。

コメントは受け付けていません。