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;
}