Система обмена сообщениями CakePHP - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь реализовать простую систему обмена сообщениями в CakePHP 1.3. Что мне нужно сделать, так это выполнить запрос, чтобы вернуть массив пользователей, с которыми мой вошедший в систему пользователь ведет беседу (то есть либо получил сообщение, либо отправил сообщение, либо и то, и другое).

Модель «Мой пользователь» настроена так:

class User extends AppModel {
    var $name = 'User';
    var $actsAs = array('Containable');

    var $hasMany = array(

        'SentMessages' =>
        array (
            'className' => 'Message',
            'foreignKey' => 'sender_id'
        ),

        'ReceivedMessages' =>
        array (
            'className' => 'Message',
            'foreignKey' => 'receiver_id'
        )
    );  
}

Я могу использовать Containable для извлечения только Пользователя и связанных с ним сообщений и добавлять условия к этим операторам Container, чтобы ограничить эти сообщения сообщениями между каждым пользователем и моим зарегистрированным пользователем.

$users = $this->User->find('all', array(
    'contain' => array(
        'ReceivedMessages' => array(
            'conditions' => array(
                'receiver_id' => $my_user_id
            )
        ),
        'SentMessages' => array(
            'conditions' => array(
                'sender_id' => $my_user_id
            )
        )
    )
));

Однако, это все еще возвращает КАЖДОГО пользователя в моей БД. Есть ли способ написать этот запрос так, чтобы возвращались только пользователи с любыми сообщениями SentMessages или ReceivedMessages?

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 января 2012
$users = $this->User->find('first', array(
    'conditions' => array('User.id' => $my_user_id),
    'contain' => array(
        'ReceivedMessages' => array(
            'conditions' => array(
                'receiver_id' => $my_user_id
            )
        ),
        'SentMessages' => array(
            'conditions' => array(
                'sender_id' => $my_user_id
            )
        )
    )
));

Я рассуждаю по исходному коду, который вы находите all, но не указываете условие для , которое находит.

Затем Cake возвращает ВСЕХ ваших пользователей и любые сообщения, где они существуют.Я ожидаю, что массив $users содержит правильные данные в правильном формате, но вам нужны только определенные пользователи.

Добавив условие в начальную находку, вы должны быть в порядке.

0 голосов
/ 12 января 2012

Я решил это, добавив новую сущность «Разговор», например:

var $hasMany = array(
    'Message' => array(
        'className' => 'Message',
        'foreignKey' => 'conversation_id'
    )
);

var $belongsTo = array(
    'FirstUser' => array(
        'className' => 'User',
        'foreignKey' => 'first_user_id'
    ),
    'SecondUser' => array(
        'className' => 'User',
        'foreignKey' => 'second_user_id'
    )
);

Затем выполните следующую находку:

$conversations = $this->Conversation->find('all',array(
    'conditions' => array(
        'OR' => array(
            'Conversation.first_user_id' => $this->my_user_id,
            'Conversation.second_user_id' => $this->my_user_id
        ),
        'Conversation.modified >' => date("Y-m-d H:i:s", $since_timestamp)
    )
);
...