CActiveDataProvider сложное состояние - PullRequest
1 голос
/ 04 августа 2011

У меня есть таблица wall_messages со следующими столбцами

id
from_user_id
тема
сообщение
дата
message_reply_id

Я хочу получитьCActiveDataProvider со всеми настенными сообщениями, которые имеют заданное значение для столбца _from_user_id_.Пока все хорошо.

        $outgoingMessages = new CActiveDataProvider ('Messages', array ( 
        'criteria' => array (
            'condition' => 'from_user_id ='.$userId->id,
        ), 
        'pagination' => array ( 
            'PageSize' => 5, 
        ) 
    ));

Теперь мне нужно добавить следующее условие: для тех настенных сообщений с соответствующим значением _from_user_id_ И соответствующим значением _message_reply_id_ я хочу сохранить только одну из этих строк.Который из?Тот, у которого «самая старая» дата.Как я могу это сделать?Я не очень хорошо с SQL запросов, так что это довольно сложно для меня.спасибо!

Я нашел временное решение, которое является полной противоположностью элегантному:

    $sentMessages = array();
    $alreadyIncludedMessages = array();

    foreach ($user->messagesOut as $mess) {
        if (!in_array($mess->message_reply_id, $alreadyIncludedMessages)){
            $sentMessages[] = $mess;
            $alreadyIncludedMessages[]=$mess->message_reply_id;
        } 
    }
    $outgoingMessages = new CActiveDataProvider ('Messages', array ( 
        'pagination' => array ( 
            'PageSize' => 5, 
        ),
        'data'=>$sentMessages
    ));

1 Ответ

1 голос
/ 04 августа 2011

Если вы хотите просто вернуть одно значение, вы можете использовать что-то вроде:

  'criteria' => array (
    'condition' => 'from_user_id = :userId AND message_reply_id = :messageId',
    'order' => 'date ASC',
    'params' => array(':userId'=>$userId->id, ':messageId'=>$messageId)
  ),
  'pagination' => array ( 
    'PageSize' => 1,
  )

и не отображать нумерацию страниц.Если вы хотите отобразить самое старое сообщение для каждого пользователя, вам, вероятно, придется использовать подзапрос или заполнить массив, а затем использовать CArrayDataProvider , что может быть полезно для сложных запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...