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のインスタンスには、関連データが残っているからかな。??