[CakePHP]virtualFieldsを設定したModelをbindModelするとエラーが出る場合の対処

Why ask why? © by °Florian

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を利用するときはモデル名を入れるようにします。

  1. CONCATも []
スポンサーリンク
336x280_1
336x280_1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
336x280_1