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としてログインしているex imの場合、チャットリストに表示したい
USER 5 (最後のメッセージ: ユーザー 1 からユーザー 5 へのメッセージ) USER 2 (最後のメッセージ: こんにちはユーザー 1)
Simpy: この配列内のユーザーとの間の最後のメッセージを 1 つだけにしたい... すべてのメッセージのリストは必要ない... GMAIL ボックスのように、ユーザーとの最後のメッセージを 1 つだけ。今、私はすべてのユーザーとメッセージの関連付けを配列に持っています...
関数を作成します... ユーザーのすべてのメッセージを取得します... 最大の ID を持つメッセージを 1 つだけ取得するにはどうすればよいですか?
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 で注文します...
誰でも私を助けることができますか?