忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

FuelPHPのORM覚え書き

FuelPHPのORMモデルのリレーション定義で、「cascade_save」っていうのがある。

多分、これをtrueにするとsave()した時に親子(孫)関係のモデルも一気にDBに書き込んでくれるのだと思うけど、実際に使ってみたところ、親のモデルでsave()しても親のモデルだけが保存された。
子(孫)のモデルでsave()したら親のモデルも保存された。

具体的にはこんな感じ

Model_User
    protected static $_has_many = array(
            'shops' => array(
                'key_from' => 'id',
                'model_to' => 'Model_Shop',
                'key_to' => 'user_id',
                'cascade_save' => true,
                'cascade_delete' => false,
            )
    );

Model_Shop
    protected static $_belongs_to = array(
            'user' => array(
                'key_from' => 'user_id',
                'model_to' => 'Model_User',
                'key_to' => 'id',
                'cascade_save' => true,
                'cascade_delete' => false,
            )
    );
    protected static $_has_many = array(
            'options' => array(
                'key_from' => 'id',
                'model_to' => 'Model_Option',
                'key_to' => 'shop_id',
                'cascade_save' => true,
                'cascade_delete' => false,
            )
    );
Model_Option
    protected static $_belongs_to = array(
            'shop' => array(
                'key_from' => 'shop_id',
                'model_to' => 'Model_Shop',
                'key_to' => 'id',
                'cascade_save' => true,
                'cascade_delete' => false,
            )
    );

上記3つのモデルをそれぞれnewしてアトリビュートをセットしていき、リレーションを繋ぎ、最後にModel_Optionをsave()するとOK。Model_Userをsave()しても保存されるのはModel_Userだけだった。

$user = new Model_User();
$user->name = 'ほげ';
$shop = new Model_Shop();
$shop->name = 'Hoge';
$shop->user = $user;
$option = new Model_Option();
$option->val = 1;
$option->shop = $shop;
$option->save();     // $user->save(); だとうまくいかない

って、書いてて何故か分かった気がする。
子と孫側からは繋げてるけど、親側からは繋げていないからか。

最後に
$user->shops[] = $shop;
$shop->options[] = $option;

って書けば、$user->save()で孫まで保存されるのではないかと。


PR

この記事にコメントする

お名前
タイトル
メール
URL
コメント
絵文字
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
パスワード