4

説明しようとしている奇妙な行動をしています。

私は、すべてのユーザーが自分のプロフィール、写真、またはメッセージを他のユーザーから報告できるレポートシステムを構築しています。

バックエンドで、すべてのユーザーが報告された合計回数とともに行に表示される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';
4

2 に答える 2

4

CActiveDataprovider を使用する場合、YII は条件で確立された「with」を使用せずに「totalItemCount」を実行するため、with を使用しない結果の総数が表示されます。これを克服するために、手動で結合条件を追加することをお勧めします:)

$criteria->join = 'left join User u on u.id=t.reported_id'

$criteria->select を削除し、CActiveDataProvider の「totalItemCount」メソッドを使用します。

于 2012-06-12T08:54:39.600 に答える
3

「bennouna」という名前のユーザーによって投稿された、yii のフォーラムで見つけました。それは私のためにトリックをしました。

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;
}
于 2012-06-13T13:12:59.597 に答える