Php Yii奇怪的行为:CGridView+;组+;具有

Php Yii奇怪的行为:CGridView+;组+;具有,php,mysql,gridview,yii,Php,Mysql,Gridview,Yii,我有一种奇怪的行为,我要试着解释一下 我正在建立一个报告系统,每个用户都可以让其他用户报告他们的个人资料、图片或消息 在后端,我想显示一个列表,其中每个用户都显示在一行中,并显示报告的总次数 为此,我在标准中添加了group,效果很好 但是,如果我想按任何相关字段过滤视图,我必须将with添加到条件中,它与过滤或搜索效果良好,但结果的总显示是不正确的,显示显示15个结果中的1-2个当它应该显示显示2个结果中的1-2个时与报告表一样,我有15行,但只有两个用户,还添加了一个不存在的分页 model

我有一种奇怪的行为,我要试着解释一下

我正在建立一个报告系统,每个用户都可以让其他用户报告他们的个人资料、图片或消息

在后端,我想显示一个列表,其中每个用户都显示在一行中,并显示报告的总次数

为此,我在标准中添加了
group
,效果很好

但是,如果我想按任何相关字段过滤视图,我必须将
with
添加到条件中,它与过滤或搜索效果良好,但结果的总显示是不正确的,显示显示15个结果中的1-2个当它应该显示显示2个结果中的1-2个时与报告表一样,我有15行,但只有两个用户,还添加了一个不存在的分页

models/Report.php

public function relations()
{
    return array(
        'reported' => array(self::BELONGS_TO, 'User', 'reported_id'),
    );
}

public function search()
{
    $criteria = new CDbCriteria();
    $criteria->select = array(
        '*',
        'count(*) as reports_count',
    );
    $criteria->group = 't.reported_id';
    $criteria->with = array('reported');

    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
        'sort'=>array(
            'attributes'=>array(
                'status_search'=>array(
                    'asc'=>'reported.user_status_id',
                    'desc'=>'reported.user_status_id DESC',
                ),
                'reports_count' => array(
                    'asc' => 'reports_count ASC',
                    'desc' => 'reports_count DESC',
                ),
                '*',
            ),
        ),
        ));
} 
更新:我使用join而不是with找到了解决方案,并选择了我需要的字段,而不是使用*选择所有字段:

$criteria->select = array(
        't.id, t.reported_id',
        'count(*) as reports_count',
    );
$criteria->group = 't.reported_id';
$criteria->join = 'LEFT JOIN user u on u.id = t.reported_id';

当使用CActiveDataprovider时,YII不会使用标准中建立的“with”来进行“totalItemCount”,因此它会显示不带with的结果总数。我建议您手动添加联接条件以克服此问题:)


然后删除$criteria->选择并使用CActiveDataProvider的“totalItemCount”方法。

我在yii的论坛上找到了它,由一个名为“bennouna”的用户发布。 这对我起了作用

public function groupedSearch() {
  $criteria = new CDbCriteria;
  $criteria->select = '…';
  $criteria->with = array(…);
  $criteria->group = '…';
  $dp = new CActiveDataProvider($this, array('criteria'=>$criteria));
  $dp->setTotalItemCount(count($this->findAll($criteria)));
  return $dp;
}

我也有类似的问题,只是情况正好相反
CGridView
显示的结果比寻呼机显示的结果要少,结果我设置了一个很大的限制。最终,这可能是一个
Yii
错误,但我想用“reports\u count”显示的是特定用户在数据库中的行总数。例如,我在数据库中有15个用户:user1被报告了14次,user2被报告了一次。我找到了方法,我将用解决方案更新我的问题。你的解决方案很棒。我很高兴你得到了答案:)
public function groupedSearch() {
  $criteria = new CDbCriteria;
  $criteria->select = '…';
  $criteria->with = array(…);
  $criteria->group = '…';
  $dp = new CActiveDataProvider($this, array('criteria'=>$criteria));
  $dp->setTotalItemCount(count($this->findAll($criteria)));
  return $dp;
}