virtualFieldsを設定*1 していて、そのモデルをアソシエーションしたときに下記のようなエラーが出るなら、このページが役に立つでしょう。
SQL Error: 1052: Column ‘id’ in field list is ambiguous
Parentモデル
var $virtualFields = array( "id_and_name" => "CONCAT(id, ':', name)", );
Childモデル
$bind = array( "belongsTo" => array( "Parent" ); ); $this->Child->bindModel($bind); $childs = $this->Child->find("all");
このような指定をしている場合、Childモデルにidというフィールドがあるとfindに失敗します。
というのも、ParentモデルのvirtualFIeldsの指定でCONCAT();のフィールド指定にモデル名が無いため、LEFT JOINされたときにどちらのテーブルのidかわからないためです。
単純な事ですが、こういうのがハマると気付きにくいんですよね。
というわけで下記のようにしましょう。
Parentモデル
var $virtualFields = array( "id_and_name" => "CONCAT(Parent.id, ':', Parent.name)", );
今後CONCATを利用するときはモデル名を入れるようにします。
- CONCATも [↩]