Laravel中groupBy触发1055错误,常规解决方案无效求助
我来帮你搞定这个头疼的1055错误!你已经尝试了修改strict模式和sql modes,但还是踩坑,大概率是这几个原因:配置没生效,或者你的查询本身不符合MySQL的分组规则,咱们一步步来解决:
1. 先确认MySQL实际生效的sql_mode
有时候你在Laravel里配置了modes,但MySQL的全局配置或者会话级配置还带着ONLY_FULL_GROUP_BY,导致错误依然存在。先在数据库客户端(比如Navicat、phpMyAdmin)里运行这条命令:
SELECT @@sql_mode;
如果结果里还能看到ONLY_FULL_GROUP_BY,说明你的Laravel配置没覆盖成功,或者缓存没清。
2. 确保Laravel配置正确且生效
打开config/database.php,确认mysql连接的配置是这样的:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => false, // 这里必须设为false 'modes' => [ 'STRICT_TRANS_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'ERROR_FOR_DIVISION_BY_ZERO', 'NO_AUTO_CREATE_USER', 'NO_ENGINE_SUBSTITUTION', ], // 这里绝对不能包含ONLY_FULL_GROUP_BY 'engine' => null, ],
改完配置后必须清除配置缓存,不然Laravel还是用旧的配置:
php artisan config:clear
重启一下你的服务(比如nginx、php-fpm),确保配置完全生效。
3. 修改你的查询语句(从根源解决问题)
其实即使关闭了ONLY_FULL_GROUP_BY,你的查询逻辑本身也有问题:你按order_id分组,但又要获取id字段(get()会取出所有字段),而同一个order_id可能对应多个id,MySQL不知道该返回哪个id给你,这才是错误的本质。
正确的做法是:要么只选择groupBy里的字段,要么用聚合函数处理其他字段。比如你想获取每个order_id对应的最新记录(按id降序),可以这样写:
$orders = Order::select('order_id', DB::raw('MAX(id) as latest_id'), /* 其他需要的字段,用聚合函数处理 */) ->groupBy('order_id') ->orderBy('latest_id', 'desc') ->get(); dd($orders);
或者如果你需要完整的最新记录,可以用子查询来实现:
$latestOrders = Order::select('*') ->whereIn('id', function($query) { $query->select(DB::raw('MAX(id)')) ->from('orders') ->groupBy('order_id'); }) ->orderBy('id', 'desc') ->get(); dd($latestOrders);
这样既符合MySQL的分组规则,又能拿到你想要的数据,比单纯关闭严格模式更规范。
最后再检查一遍
如果还是报错,先重启你的Laravel服务,再重新运行查询。有时候缓存或者会话的残留会导致配置不生效。
内容的提问来源于stack exchange,提问作者zahid hasan emon

