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を追記するようにしたほうがよさそうです。