2

次の関係を持つ 3 つのモデル ( UserMessageおよび) があります。Tag

  • User 多くを持っています Message
  • Message 属する User
  • Message ハブTM Tag
  • Tag ハブTM Message

Messageユーザーがログインしている場合、何かでタグ付けされたすべてのものを見たいと思うかもしれません。

$messages = $this->Message->find('all', array(
    'conditions' => array("Message.user_id" => $this->uid),
    'contain' => array(
        'Tag' => array(
            'conditions' => array(
                'Tag.id' => $activetag['Tag']['id']
            )
         )
    ));

ただし、この検索で​​は、そのユーザーのすべてのメッセージが返されます。(収容可能な動作は両方のモデルに含まれています)

4

2 に答える 2

1

子 (タグ) に含まれるものは、親 (メッセージ) に対してフィルターを実行しません。そのため、すべてのメッセージが返されます。タグ自体に含まれるのみの配置条件。あなたの場合、$activeTag に一致しないメッセージは返されますが、空のタグ配列が添付されますが、一致するメッセージは $activeTag という 1 つのタグのみを含む配列で返されますが、すべてのメッセージが返されます。返されます。

あなたの目的のために、CakepHP は HABTM でフィルタリングするために結合関数を使用することを推奨します。これは hasOne または belongsTo を自動的に結合しますが、HABTM に関しては、必要に応じて自分で結合を実行する必要がある場合があります。

テーブルが慣習的に命名されていると仮定します。

$this->Message->recursive = -1;

$options['joins'] = array(
    array('table' => 'messages_tags',
        'alias' => 'MessageTag',
        'type' => 'INNER',
        'conditions' => array(
            'Message.id = MessageTag.message_id',
        )
    ) );

$options['conditions'] = array(
    'MessageTag.tag_id' => $activetag['Tag']['id'],
    'Message.user_id' => $this->uid );

$message = $this->Message->find('all', $options);

詳細はこちら: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables

于 2013-05-30T01:44:31.683 に答える
0

モデルメッセージに追加

**
 * @see Model::$actsAs
 */
    public $actsAs = array(
        'Containable',
    );

/**
 * @see Model::$belongsTo
 */
    public $belongsTo = array(
        'Message' => array(
            'className' => 'Message',
            'foreignKey' => 'message_id',
        ),
        'Tags' => array(
            'className' => 'Tag',
            'foreignKey' => 'tag_id',
        ),
    );

あなたのコントローラーで:

// $tagsId = tags ids
    $message = $this->MessageTag->find('all', array('conditions' => array('MessageTag.tag_id' => $tagsId),'contain' => array('Message')));

また、tags(複数)、message_tags(最初の単数、2番目の複数)、messages(複数)テーブルがある場合は、Tag、MessageTag、Message Modelsが必要です。

于 2013-02-18T23:36:06.550 に答える