3

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 );
            }
            ...

しかし、これは何もしていないようです。これは正しいアプローチですか?ログにエラーは表示されません。

前もって感謝します

4

1 に答える 1

1

保存する前に、すべての記事とタグがすでに存在していますか?

とにかく、私は通常、別の方法でHABTM関係を保存します。これは、関連付けモデルではなく、メインモデルの1つを保存することによって行います。

以下のようにデータを整理してください$this->Tag->save($data);。その奇妙な二重配列形式により、タグが最初に更新され、次にArticlesTagデータが更新されます。逆の場合も機能するため、タグを記事に交換して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 に答える