按不工作分组 - Laravel
Group by not working - Laravel
我无法在 Laravel 5.3
中 运行 这个简单的查询
$top_performers = DB::table('pom_votes')
->groupBy('performer_id')
->get();
它给了我:
SQLSTATE[42000]: Syntax error or access violation: 1055 'assessment_system.pom_votes.id' isn't in GROUP BY (SQL: select * from `pom_votes` group by `performer_id`)
但是,如果我从错误中复制原始查询并直接在 PhpMyAdmin 中触发,它工作正常。
我已经检查过了:
https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset
如有任何帮助,我们将不胜感激。
谢谢,
帕斯沃拉
编辑应用程序的数据库配置文件config/database.php
在mysql
数组中,设置strict => false
禁用MySQL的严格模式
您的问题可能是因为您使用的是 MySQL 服务器版本 5.7.5+。从这个版本开始,GROUP BY
的工作方式发生了变化,因为它们使它的行为符合 SQL99(在以前的版本中不是)。
尝试进行完整分组或更改 MySQL 服务器的配置。
Link 到官方 MySQL 文档,其中解释了完整的 GROUP BY
如果您设置为 false strict mode,那么您将无法使用其他严格功能来修复此错误转到 Illuminate\Database\Connectors\MySqlConnector.php 并更改功能如下所示:
protected function strictMode() {
return "set session
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY
_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'";
}
用这个替换函数。
编辑应用程序的数据库配置文件config/database。php
在 mysql 数组中,设置 strict => false 以禁用 MySQL 的严格 mod
或
sudo nano /etc/mysql/mysql.cnf
[mysqld]
sql_mode = NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Go to config/database.php
更新严格值 false。
return [
'connections' => [
'mysql' => [
'strict' => false
]
]
]
将您的 database.php 文件从 config/database.php 'strict' => true
修改为 'strict' => false
'mysql' => [
'strict' => false
],
更安全的方法而不是禁用严格 ('strict' => false
) 你可以做的是将一个数组传递给配置,只启用你想要的模式:
// config/database.php
'connections' => [
//...
'mysql' => [
//...
'strict' => true,
'modes' => [
//'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
//'NO_AUTO_CREATE_USER', // This has been deprecated and will throw an error in mysql v8
'NO_ENGINE_SUBSTITUTION',
],
],
],
对于更改该设置后仍然出现相同错误的任何人,请尝试通过 运行 php artisan config:cache
清除配置缓存
我无法在 Laravel 5.3
中 运行 这个简单的查询$top_performers = DB::table('pom_votes')
->groupBy('performer_id')
->get();
它给了我:
SQLSTATE[42000]: Syntax error or access violation: 1055 'assessment_system.pom_votes.id' isn't in GROUP BY (SQL: select * from `pom_votes` group by `performer_id`)
但是,如果我从错误中复制原始查询并直接在 PhpMyAdmin 中触发,它工作正常。
我已经检查过了:
https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset
如有任何帮助,我们将不胜感激。
谢谢,
帕斯沃拉
编辑应用程序的数据库配置文件config/database.php
在mysql
数组中,设置strict => false
禁用MySQL的严格模式
您的问题可能是因为您使用的是 MySQL 服务器版本 5.7.5+。从这个版本开始,GROUP BY
的工作方式发生了变化,因为它们使它的行为符合 SQL99(在以前的版本中不是)。
尝试进行完整分组或更改 MySQL 服务器的配置。
Link 到官方 MySQL 文档,其中解释了完整的 GROUP BY
如果您设置为 false strict mode,那么您将无法使用其他严格功能来修复此错误转到 Illuminate\Database\Connectors\MySqlConnector.php 并更改功能如下所示:
protected function strictMode() {
return "set session
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY
_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'";
}
用这个替换函数。
编辑应用程序的数据库配置文件config/database。php
在 mysql 数组中,设置 strict => false 以禁用 MySQL 的严格 mod
或
sudo nano /etc/mysql/mysql.cnf
[mysqld] sql_mode = NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Go to config/database.php
更新严格值 false。
return [
'connections' => [
'mysql' => [
'strict' => false
]
]
]
将您的 database.php 文件从 config/database.php 'strict' => true
修改为 'strict' => false
'mysql' => [
'strict' => false
],
更安全的方法而不是禁用严格 ('strict' => false
) 你可以做的是将一个数组传递给配置,只启用你想要的模式:
// config/database.php
'connections' => [
//...
'mysql' => [
//...
'strict' => true,
'modes' => [
//'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
//'NO_AUTO_CREATE_USER', // This has been deprecated and will throw an error in mysql v8
'NO_ENGINE_SUBSTITUTION',
],
],
],
对于更改该设置后仍然出现相同错误的任何人,请尝试通过 运行 php artisan config:cache