蛋糕PHP限制关联


CakePHP limit association

我尝试像在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登录的exim,我想在我的聊天列表中看到

用户 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 排序...此订单由 message.id ASC

...

有人可以帮助我吗?

您可以在

查询消息时传递一个时间戳,您必须在保存消息时保存时间戳

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