人気ブログランキングへ

2017年03月25日

FuelPHP で Orm\Model クラスのリレーション定義しても cascade がうまく動作しない

PHP Framework: FuelPHP
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日かかってしまった。。。
タグ:FuelPHP PHP
posted by K/I at 14:51 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック