説明しようとしている奇妙な行動をしています。
私は、すべてのユーザーが自分のプロフィール、写真、またはメッセージを他のユーザーから報告できるレポートシステムを構築しています。
バックエンドで、すべてのユーザーが報告された合計回数とともに行に表示されるCGridViewを表示したいと思います。
それを行うために、私はgroup
基準に追加しています、そしてそれはうまくいきます。
ただし、関連するフィールドでビューをフィルタリングする場合はwith
、条件に追加する必要があり、フィルタリングまたは検索でうまく機能しますが、結果の合計表示が正しくなく、15件中1〜2件の結果が表示されます。レポートテーブルのように2つの結果のうち1〜2を表示するように表示される場合、 15行ありますが、ユーザーは2人だけで、存在しないページ番号も追加されます。
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',
),
'*',
),
),
));
}
更新: withの代わりにjoinを使用し、*ですべてを選択する代わりに必要なフィールドを選択することで解決策を見つけました:
$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';