0

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 で注文します...

誰でも私を助けることができますか?

4

1 に答える 1

0

メッセージのクエリ中にタイムスタンプを 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;
  }
于 2012-08-14T12:15:08.690 に答える