LoginSignup
11
11

More than 5 years have passed since last update.

中間テーブルを用いた多対多($_many_many)関連データの編集方法

Last updated at Posted at 2015-11-06

fuelphpで作成したブログサイトのブログ記事にタグ情報をつける処理を作成するときに、編集処理にて苦戦したので、まとめておきます。

タグの仕様
・ブログ記事に複数のタグが設定できること。
・タグをクリックすると同じタグを持つブログ記事を集約できること。

使用モデル
ブログ記事のモデル(Model_Atricle)
タグモデル(Model_Tag)
中間テーブルモデル(Model_Articletags)

Model_Atricleのリレーション設定

中間テーブルモデル(Model_Articletags)を1対多の関係
タグモデル(Model_Tag)を多対多の関係で設定する。

artcile.php
protected static $_has_many = array(

         'th_tag' => array(
                'key_from' => 'id',
            'model_to' => 'Model_articletags',
            'key_to' => 'article_id',
            'cascade_save' => TRUE,
            'cascade_delete' => FALSE,
         ),
);

protected static $_many_many =  array(

            'tags' => array(
                'key_from' => 'id',
                'key_through_from' => 'article_id',
                'table_through' => 'blogarticle_tags',
                'key_through_to' => 'tag_id',
                'key_to' => 'id',
                'model_to' => 'Model_Tags',
                'cascade_save' => TRUE,
                'cascade_delete' => false,
            )

);

Model_Articletagsのリレーション設定

ブログ記事のモデル(Model_Atricle)を1対1の関係
タグモデル(Model_Tag)を1対1の関係で設定する。

artcile.php
protected static $_belongs_to= array(
    'article' => array(
        'key_from' => 'article_id',
        'model_to' => '\Blog\Model_Blogaritcle',
        'key_to' => 'id',
        'cascade_save' => FALSE,
        'cascade_delete' => FALSE,
    ),

    'tag' => array(
            'key_from' => 'tag_id',
            'model_to' => '\Blog\Model_Blogtags',
            'key_to' => 'id',
            'cascade_save' => FALSE,
            'cascade_delete' => FALSE,
    ),
);

編集処理
タグを編集する際は、すでに設定されているタグ外されている場合があるので、
一旦設定されているタグを削除する。
但しタグモデルを削除すると、ほかの記事に設定されているタグも削除されるので、中間テーブルモデルを削除する。

blogedit.php
$blog_article = Model_Aritcle::find($article_id); 

//中間タグテーブル削除.
unset($blog_article->th_tag);


//ここで一旦保存
$blog_article->save();

//送信されたタグ情報をセットする.
if(Input::post('tags')){
    foreach (Input::post('tags') as $tag_id){
        $blog_article->tags[] = Model_Tags::find($tag_id);
    }
}else{}

$blog_article->save(); //完了.

途中でunsetで$blog_articleのth_tag、中間テーブルモデルを解除しているのは、そのままdelete処理を行ってもsave()時に戻ってしまう為です。

$blog_articleのインスタンスには、関連データが残っているからかな。??

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11