3

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

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

提前致谢

4

1 回答 1

1

所有文章和标签在您保存之前是否已经存在?

无论如何,我通常以不同的方式保存 HABTM 关系——我通过保存一个主要模型来做到这一点,而不是通过关联模型。

像下面这样排列您的数据,然后执行$this->Tag->save($data);. 这种奇怪的双数组格式确保首先更新标签,然后更新 ArticlesTag 数据。它也可以反过来工作,因此您可以将 Tag 换成 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
    )
),
)
于 2013-03-21T05:35:40.487 回答