CActiveDataProvider复杂条件

时间:2011-08-03 23:37:55

标签: php activerecord yii

我有一个带有以下列的表wall_messages

ID
from_user_id
主题
消息
日期
message_reply_id

我想获取一个CActiveDataProvider,其中包含_from_user_id_列的给定值的所有wall消息。到目前为止一切都很好。

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

现在,我需要添加以下条件:对于那些匹配_from_user_id_值且匹配_message_reply_id_值的wall消息,我只想保留其中一行。哪一个?具有“最早”日期的那个。我怎样才能做到这一点?我对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 个答案:

答案 0 :(得分:1)

如果您想要返回一个值,可以使用以下内容:

  '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 ,这对复杂查询非常有用。