解决laravel5.4下的group by报错的问题
1. 问题描述
在laravel5.4中,当使用group by方法来进行聚合操作时,会报错:
```php
SQLSTATE[42000]: Syntax error or access violation: 1055
Expression #3 of SELECT list is not in GROUP BY clause and contains
nonaggregated column 'database.table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```
这种情况在mysql5.7以上版本的严格模式中非常常见,通常是因为sql_mode的限制导致。
2. 解决方法
2.1 修改配置文件
解决这个问题的第一种方式是在mysql配置文件中进行修改。打开mysql的配置文件my.cnf,一般位于/etc/mysql/下。在文件中添加以下内容:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
这段代码会将sql_mode设置为一个不包含 `only_full_group_by` 的字符串。然后重启mysql服务即可,这个问题就会被解决。
2.2 修改代码
另一种解决方式是在代码中进行修改。在laravel5.4中,可以在config/database.php配置文件中修改mysql的strict选项:
// database.php
return [
// ...
'connections' => [
'mysql' => [
// ...
'strict' => false,
],
],
];
将strict选项设置为false即可。
3. 总结
通过修改mysql的sql_mode或在laravel的配置中调整strict选项,我们可以很容易地解决 `only_full_group_by` 报错的问题。这种问题在5.7以上版本的mysql中非常常见,为了保证代码的兼容性,我们应该在项目开始时充分考虑mysql的版本及其SQL_MODE设置。
参考资料:
- [MySQL :: MySQL 5.7 Reference Manual :: 5.1.11 Server System Variables](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode)
- [SQL group by 报错:Expression #XXX of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXX' which is not functionally dependent on columns in GROUP BY clause;](https://www.linuxidc.com/Linux/2016-11/137141.htm)