我有两个模型,文章和标签,每个模型都通过hasAndBelongsToMany关系链接。标签可以通过名为addTagToArticles的Tag模型中的函数一次应用于多个文章。文章有一个状态字段,存储1表示“活动”或0表示“存档”。自动生成的连接表ArticlesTag存储标签到文章的映射,反之亦然。我希望将特定标记应用于一组文章时,它会将文章状态从活动状态更改为已存档。文章状态字段虽然在articles表上,而不在articlestag表上。更新文章状态的正确语法是什么?我是否需要在标签和文章之间创建一个动态的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;
}
}
article.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' => ''
)
);
以下是我在addTagToArticles函数内部的foreach循环中尝试过的内容,在tag.php中:
...
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 );
}
...
但这似乎没有做任何事情。这甚至是正确的方法吗?我没有在日志中看到任何错误。
提前致谢
答案 0 :(得分:1)
在保存之前,所有文章和标签是否已经存在?
无论如何,我通常以不同的方式保存HABTM关系 - 我通过保存一个主要模型而不是通过关联模型来实现。
如下所示排列您的数据,并执行$this->Tag->save($data);
。这种奇怪的双数组格式确保首先更新Tag,然后更新ArticlesTag数据。它也是相反的方式,所以您可以交换Tag for Article并在需要时调用Article->save()
。
这有帮助吗?
array(
'Tag' => array(
'id' => '42'
// any other tag data you want to update
),
'Articles' => array(
'Articles' => array(
(int) 0 => '1',
(int) 0 => '5'
// list all the articles
)
),
)