You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 19:54:03