※このエントリの内容はCakePHP1.2系を使用していた時のものです。ご注意ください。

気付いたのでメモ。
「Model::$belongsTo などを、コンストラクタで設定する場合、式の右辺が配列にならないようにするべき。」

たとえば、一般にメンバーフィールドとして記述する際には、必要な値のみ、

class Hoge extends AppModel
{
  var $belongsTo["Moge"] = array(
    "className" => "Moge",
    "foreignKey" => "moge_id",
  );

}

とすればいいですが、これと同じことをやったつもりでも、コンストラクタに以下のように書くと思った通りに動作しません。

class Hoge extends AppModel
{
  function __construct()
  {
     parent::__construct();
     $this -> belongsTo["Moge"] = array(
       "className" => "Moge",
       "foreignKey" => "moge_id",
     );
  }
}

ソースを読む時間がないので処方箋だけを言えば、

class Hoge extends AppModel
{
  function __construct()
  {
    parent::__construct();
    $this -> belongsTo["Moge"]["className"] = "Moge";
    $this -> belongsTo["Moge"]["foreignKey"] => "moge_id";
  }
}

と、する。

親クラスのインスタンス化の際に、”className”, “foreignKey” だけでなく、”conditions”, “fields”, “order”, “counterCache” にも空の値(stirng(0) “”)がセットされています。

$this -> belongsTo = array(
  "Moge" => array(
    "className" => "Moge",
    "foreignKey" => "Hoge.moge_id",
    "conditions" => "",
    "fields" => "",
    "order" => "",
    "counterCache" => "",
  )
);

これら6つの要素のすべてか、一部かは分かりませんが、$belongsTo[“Moge”]配列のキーとして、たとえ空の値であってもセットされていないと、アソシエーションを組んでくれないみたいです。

なので、コンストラクタでこれを定義する際は、それらの空の要素も含めて指定するか、必要な値のみを(配列ではなく、次数を落として)文字でセットする必要があります。