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

Laravel 8调用groupBy按group字段分组报1055错误如何解决

问题场景

PHP 7.4 环境下运行 Laravel 8 项目,现有add_ons数据表及对应Addon模型,模型包含group字段,期望通过该字段将对应行数据分组归集到同一对象下,调用模型的groupBy方法时抛出如下错误:

语法错误或访问冲突:1055 SELECT列表的第1个表达式不在GROUP BY子句中,且包含非聚合列'domainmonitor_db.add_ons.id',该列与GROUP BY子句中的列不存在函数依赖关系

原实现代码:

/**
 * Handle the incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function __invoke(Request $request)
{
    $addons = Addon::groupBy('group')->get();
}

错误截图

错误原因

这里的核心问题是混用了两种完全不同的groupBy逻辑:

  • 直接在模型查询链式调用中写groupBy('group'),属于SQL层面的分组聚合,会直接在生成的SQL语句中拼接GROUP BY 'group'。MySQL默认开启ONLY_FULL_GROUP_BY模式,要求SELECT返回的所有非聚合字段必须包含在GROUP BY子句中,而Laravel默认会查询表的全部字段(包括id、创建时间等未出现在GROUP BY规则中的字段),因此触发1055语法错误。
  • 实际需求是将查询出的所有记录按group字段归类归集,属于拿到查询结果后对结果集的分组处理,不需要在SQL查询阶段做分组。
修复方案

方案1(推荐,完全匹配归集需求)

先查询全量Addon记录,再调用Laravel集合提供的groupBy方法对结果集做分组,完全不会触发SQL语法错误:

public function __invoke(Request $request)
{
    $addons = Addon::get()->groupBy('group');
}

最终返回的结果会以group字段值为键,对应分组下的所有Addon模型集合为值,直接满足同组数据归集到同一对象下的需求。

方案2(仅适用于SQL聚合场景,不推荐用于全量记录归集)

如果你确实需要在SQL层面做分组统计类操作,可选择以下任意一种处理方式:

  • 遵循SQL GROUP BY语法规范,手动指定查询字段,仅返回GROUP BY包含的字段和聚合计算字段:
$addons = Addon::select('group', \DB::raw('COUNT(id) as addon_count'))
    ->groupBy('group')
    ->get();
  • 关闭MySQL的ONLY_FULL_GROUP_BY校验(生产环境不推荐,会破坏SQL语义严谨性,易出现不可预期的查询结果):
    修改项目config/database.php文件中mysql连接的modes配置,移除ONLY_FULL_GROUP_BY项:
    'mysql' => [
        // 其余数据库配置项保持不变
        'modes' => [
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_ENGINE_SUBSTITUTION',
            // 删除原本存在的 'ONLY_FULL_GROUP_BY' 配置
        ],
    ],
    
    修改完成后执行php artisan config:clear清除配置缓存即可生效。

内容的提问来源于stack exchange,提问作者Ryan H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:15:39