解决laravel5.4下的group by报错的问题

解决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)

后端开发标签