按不工作分组 - 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

清除配置缓存