我有两个模型,文章和标签,每个模型都通过 hasAndBelongsToMany 关系链接。通过 Tag 模型中的一个名为 addTagToArticles 的函数,可以一次将标签应用于多篇文章。文章有一个状态字段,其中存储 1 表示“活动”或 0 表示“存档”。自动生成的连接表 ArticlesTag 存储标签到文章的映射,反之亦然。我希望在将特定标签应用于一组文章时,它将文章状态从活动更改为已归档。文章状态字段在文章表上,而不是在文章标签表上。更新文章状态的正确语法是什么?我是否需要在标签和文章之间创建一个即时的 hasMany 关联,就像在http://book.cakephp.org/1.3/view/1045/Creating-and-Destroying-Associations-on-the-Fly?
以下是相关代码:
标签.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 );
}
...
但这似乎没有任何作用。这甚至是正确的方法吗?我在日志中没有看到任何错误。
提前致谢