如何在CakePHP 1.3中更新HABTM关联模型?

时间:2012-09-12 21:06:42

标签: cakephp cakephp-1.3 has-and-belongs-to-many

我有两个模型,文章和标签,每个模型都通过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 );
            }
            ...

但这似乎没有做任何事情。这甚至是正确的方法吗?我没有在日志中看到任何错误。

提前致谢

1 个答案:

答案 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
    )
),
)