hasAndBelongsToMany 関係によってそれぞれリンクされている記事とタグの 2 つのモデルがあります。addTagToArticles と呼ばれる Tag モデルの関数を使用して、タグを一度に複数の記事に適用できます。記事には、「アクティブ」を表す 1 または「アーカイブ済み」を表す 0 を格納するステータス フィールドがあります。自動生成された結合テーブル ArticlesTag には、タグから記事へのマッピング、およびその逆のマッピングが格納されます。特定のタグが一連の記事に適用されると、記事のステータスがアクティブからアーカイブ済みに変更されるようにしたいと考えています。記事のステータス フィールドは、articlestag テーブルではなく、articles テーブルにあります。記事のステータスを更新する正しい構文は何ですか? で説明されているように、タグと記事の間にその場で hasMany 関連付けを作成する必要がありますか?http://book.cakephp.org/1.3/view/1045/Creating-and-Destroying-Associations-on-the-Fly ?
関連するコードは次のとおりです。
tag.php:
var $hasAndBelongsToMany = array(
'Article' => array(
'className' => 'Article',
'joinTable' => 'articles_tags',
'foreignKey' => 'tag_id',
'associationForeignKey' => 'article_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
),
public function addTagToArticles($data) {
// Map tag to article(s)
$newtags = array();
foreach($data['Article'] AS $article_id) {
$tag_mapping = array(
'article_id' => $article_id,
'tag_id' => $data['Tag']['id']
);
$newtags[] = $tag_mapping;
}
$result = false;
if (!empty($newtags)) {
$result = $this->ArticlesTag->saveAll($newtags);
}
if ($result) {
return $data['Tag']['id'];
} else {
return false;
}
}
記事.php:
var $hasAndBelongsToMany = array(
'Tag' => array(
'className' => 'Tag',
'joinTable' => 'articles_tags',
'foreignKey' => 'article_id',
'associationForeignKey' => 'tag_id',
'unique' => true,
'dependent' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
これは、tag.php 内の addTagToArticles 関数内の foreach ループ内で試したことです。
...
if ($data['Tag']['name'] == 'special_tag' ) {
$article = $this->Article->find('first', array('conditions' => array('id' => $article_id)));
$article['Article']['status'] = Article::ARCHIVED;
$this->Article->save( $article );
}
...
しかし、これは何もしていないようです。これは正しいアプローチですか?ログにエラーは表示されません。
前もって感謝します