Yii2使用mongodb扩展时ActiveDataProvider无法添加group/groupBy条件问题
Yii2 MongoDB ActiveDataProvider 添加group分组条件解决方案
方案1:无分页需求场景
yii2-mongodb 扩展的ActiveQuery原生支持group()方法,无需分页时直接在查询实例中定义分组规则即可:
// 构造分组查询,按user_id字段分组,统计每个用户的记录数和最大交易金额 $query = YourMongoModel::find() ->where(['status' => 1]) ->group( ['user_id'], // 分组字段 [ 'total' => ['$sum' => 1], 'max_amount' => ['$max' => '$amount'] ] // 分组聚合字段 ); $dataProvider = new \yii\data\ActiveDataProvider([ 'query' => $query, 'pagination' => false, // 关闭分页,跳过自动count校验 ]);
方案2:需要分页场景
ActiveDataProvider默认会自动执行count查询生成分页参数,默认count逻辑无法识别group条件,需要手动指定totalCount:
// 基础查询条件 $baseQuery = YourMongoModel::find()->where(['status' => 1]); // 先单独查询分组后的总条数 $groupTotalCount = $baseQuery->group(['user_id'], [])->count(); // 构造完整分组查询 $query = $baseQuery->group( ['user_id'], [ 'total' => ['$sum' => 1], 'max_amount' => ['$max' => '$amount'] ] ); $dataProvider = new \yii\data\ActiveDataProvider([ 'query' => $query, 'totalCount' => $groupTotalCount, // 手动传入分组后的总条数,覆盖自动count逻辑 'pagination' => [ 'pageSize' => 10, ], ]);
注意事项
- 分组生成的聚合字段需要在对应的MongoDB Model类中声明为公共属性,否则Yii2无法正常读取字段值,比如上面示例中的
total、max_amount,需要在YourMongoModel类中添加public $total; public $max_amount; - 复杂分组场景可以直接使用
\yii\mongodb\Query类替代ActiveQuery,适配规则和上述方案完全一致
内容的提问来源于stack exchange,提问作者Vatsal Patel
相关产品推荐
相关产品推荐

