CakePHP 限制关联

Posted

技术标签:

【中文标题】CakePHP 限制关联【英文标题】:CakePHP limit association 【发布时间】:2012-08-14 10:15:05 【问题描述】:

我尝试编写一个类似于 facebook 的消息系统。 我有表格;

USERS
id, name

MESSAGES
user_from, user_to, message

我得到了模型:

USER

public $hasMany = array(
      'MessageFrom' => array(
          'className' => 'Message',
          'foreignKey' => 'user_from'
      ),
      'MessageTo' => array(
          'className' => 'Message',
          'foreignKey' => 'user_to'
      )
  );
  var $hasAndBelongsToMany = array(
      'UserMessages' => array(
          'className' => 'User',
          'joinTable' => 'messages',
          'foreignKey' => 'user_from',
          'associationForeignKey' => 'user_to'
      )
  );

MESSAGE

public $belongsTo = array(
      'UserFrom' => array(
          'className' => 'User',
          'foreignKey' => 'user_from'
      ),
      'UserTo' => array(
          'className' => 'User',
          'foreignKey' => 'user_to'
      )
  );

一切正常,我的意思是发送和接收来自用户的消息,并阅读它。 但我想在用户面板中做聊天列表。

我必须选择只有最后一条消息的所有用户才能创建与用户的聊天列表。

我的数组看起来像:

(int) 0 => array(
        'Message' => array(
            'id' => '12',
            'user_from' => '2',
            'user_to' => '1',
            'message' => 'Hello user 1!',
        ),
        'UserFrom' => array(
            'id' => '2',
            'username' => 'user2',
        ),
        'UserTo' => array(
            'id' => '1',
            'username' => 'user1',
        )
),
(int) 1 => array(
        'Message' => array(
            'id' => '12',
            'user_from' => '1',
            'user_to' => '2',
            'message' => 'Oh Hello user 2!',
        ),
        'UserFrom' => array(
            'id' => '1',
            'username' => 'user1',
        ),
        'UserTo' => array(
            'id' => '2',
            'username' => 'user2',
        )
),
    (int) 2 => array(
        'Message' => array(
            'id' => '12',
            'user_from' => '1',
            'user_to' => '5',
            'message' => 'Message to user 5 from user 1',
        ),
        'UserFrom' => array(
            'id' => '1',
            'username' => 'user1',
        ),
        'UserTo' => array(
            'id' => '5',
            'username' => 'user5',
        )
),

现在我想在我的聊天列表中查看前我登录为用户 id = 1 的信息

用户 5(最后一条消息:用户 1 给用户 5 的消息) 用户 2(最后一条消息:哦,你好,用户 1)

Simpy:我希望只有最后一条消息与此数组中的用户发送或接收... 我不需要所有消息的列表...只有来自或发往用户的最后一条消息,例如在 GMAIL 框中。 现在在数组中我有所有用户和消息关联...

我创建了一个函数...它获取用户的所有消息... 如何只获取一条 id 最大的消息?

public function getChats($user_id) 
    $this->order = 'Message.date DESC, Message.id DESC';
    $data = $this->find('all', array(
        'conditions' => array(
            'OR' => array(
                array('user_to' => $user_id),
                array('user_from' => $user_id)
            )
        )
    ));
    return $data;
  

-

SELECT `Message`.`id`, `Message`.`user_from`, `Message`.`user_to`, `Message`.`message`, `Message`.`date`, `UserFrom`.`id`, `UserFrom`.`username`, `UserFrom`.`email`, `UserFrom`.`password`, `UserFrom`.`name`, `UserFrom`.`surname`, `UserFrom`.`city`, `UserFrom`.`street`, `UserFrom`.`born_date`, `UserFrom`.`role`, `UserTo`.`id`, `UserTo`.`username`, `UserTo`.`email`, `UserTo`.`password`, `UserTo`.`name`, `UserTo`.`surname`, `UserTo`.`city`, `UserTo`.`street`, `UserTo`.`born_date`, `UserTo`.`role` FROM `gametrade_cake`.`messages` AS `Message` LEFT JOIN `gametrade_cake`.`users` AS `UserFrom` ON (`Message`.`user_from` = `UserFrom`.`id`) LEFT JOIN `gametrade_cake`.`users` AS `UserTo` ON (`Message`.`user_to` = `UserTo`.`id`) WHERE ((`user_to` = 1) OR (`user_from` = 1)) 
GROUP BY UserFrom.id,UserTo.id
ORDER BY `Message`.`id` DESC

此查询选择我的消息,但我不知道为什么不按 message.id DESC 排序... 这个顺序按mesage.id ASC...

谁能帮帮我?

【问题讨论】:

请编写一个查询,您可以通过该查询获得上述结果。这样我就可以帮上忙了。 您不能限制仅运行一个查询的关联模型的结果。您必须运行第二个查询或运行复杂/原始 SQL 查询才能完成此操作。 【参考方案1】:

你可以在查询消息时传递一个时间戳,你必须在保存消息的同时保存时间戳

public function getChats($user_id,$timestamp) 
    $this->order = 'Message.date DESC, Message.id DESC';
    $data = $this->find('all', array(
        'conditions' => array(
            'OR' => array(
                array('user_to' => $user_id),
                array('user_from' => $user_id)
            ),
            'created >' => $timestamp 
        )
    ));
    return $data;
  

【讨论】:

以上是关于CakePHP 限制关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 1.3 关联

cakephp 多个数据库中的关联 Cakephp 2

CakePHP 3:保存关联模型失败

CakePHP 多模型关联

CakePHP 模型关联深层模型包含

HABTM 关联未保存 - cakephp