Version: 1.8
FuelPHP の ORM モデルクラスに $_has_many プロパティを定義してリレーションを定義すると、JOIN が楽になるほか save() や delete() 実行時に関連テーブルのデータも自動的に save()、delete() させるように設定が可能となる。
https://fuelphp.com/docs/packages/orm/relations/intro.html
ところが、この $_has_many プロパティのキーの選び方には注意が必要であることがわかった。
$_has_many のキーに、テーブルのフィールド名と同じ名前を選んではいけない!
つまり、上記 Document ページでいうと
protected static $_has_many = array('comments' => array(
'model_to' => 'Model_Fancy_Comment',
'key_from' => 'article_id',
'key_to' => 'parent_article_id',
'cascade_save' => true,
'cascade_delete' => false,
// there are some more options for specific relation types
));
の
'comments'
が、$_properties に含まれていると、動作がおかしくなる。。。たとえば \Orm\Model クラスの delete() メソッドがどうなっているかを見てみると、
foreach($this->relations() as $rel_name => $rel) {
:
$rel->delete($this, $this->{$rel_name}, true, $should_cascade);
}
としている。
$rel_name は $_has_many プロパティのキー、$rel は \Orm\HasMany オブジェクトが代入されるのだが、$this->{$rel_name} がモデルクラスのフィールド参照とモロかぶりなのである。
これがわかるまで、丸1日かかってしまった。。。