2

我有 3 个模型(UserMessageTag具有以下关系:

  • User 有很多 Message
  • Message 属于 User
  • Message HABTM Tag
  • Tag HABTM 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,但所有消息会被退回。

出于您的目的,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')));

也最好遵循蛋糕命名约定,如果你有标签(复数),message_tags(第一个单数第二个复数),messages(复数)表,你必须有标签,消息标签,消息模型。

于 2013-02-18T23:36:06.550 回答