小组不工作 - Laravel

Par*_*ora 25 query-builder laravel laravel-5.3

我无法在Laravel 5.3中运行这个简单的查询

$top_performers = DB::table('pom_votes')
        ->groupBy('performer_id')
        ->get();
Run Code Online (Sandbox Code Playgroud)

它给了我:

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`)
Run Code Online (Sandbox Code Playgroud)

但是,如果我从错误中复制原始查询并直接在PhpMyAdmin中触发,它可以正常工作.

我已经检查了这个:

https://laravel.com/docs/5.3/queries#ordering-grouping-limit-and-offset

任何帮助将是appricaited.

谢谢,

Parth Vora

Md.*_*Mia 88

编辑应用程序的数据库配置文件 config/database.php

mysql数组中,设置strict => false为禁用MySQL的严格模式

  • 禁用严格模式不是一个好的解决方案.请参阅以下@GabrieleCiech的答案 (8认同)
  • 你能详细说明为什么这个问题解决了吗? (4认同)
  • 万分感谢.这是确切的问题. (3认同)
  • 如果在Laravel文档的某处提到它会很好。 (2认同)
  • 感谢您的回答。辛苦了 并且您能解释一下mysql配置中“ strict”参数的作用吗? (2认同)

小智 21

也许您的问题是由于您使用的是MySQL服务器版本5.7.5+.从这个版本开始,工作方式GROUP BY会发生变化,因为它们的行为是为了符合SQL99(在以前的版本中不是这样).

尝试通过执行完整的组或更改MySQL服务器的配置.

连接到MySQL官方文档,其中满GROUP BY是explanined

  • 我希望随着时间的推移,这个答案将获得更多的选票,因为它应该被认为是正确的答案。了解事情为什么起作用以及应该如何处理很重要。 (3认同)

小智 8

更安全的方法不是禁用 strict ( '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',
            ],
        ],
    ],
Run Code Online (Sandbox Code Playgroud)

对于更改该设置后仍然遇到相同错误的任何人,请尝试通过运行清除配置缓存php artisan config:cache


kac*_*_dk 6

有一些方法可以解决这个问题

#1

仅获取我们分组所依据的列,在本例中为category_id。

注意:中的列select必须存在于 中groupBy,反之亦然。

$posts = Post::query()
    ->select('category_id')
    ->groupBy('category_id')
    ->get();
Run Code Online (Sandbox Code Playgroud)
类别_id
1
2

#2

但我想要所有专栏!

好的,所以您想要获取所有列。那么技巧就是不要在数据库级别使用 groupBy() 。相反,您可以将其与返回的集合一起使用。

$posts = Post::query()
    ->get()
    ->groupBy('category_id');
Run Code Online (Sandbox Code Playgroud)
[
 
'1' => [
    ['id' => 1, 'name' => 'Post 1', 'category_id' => 1, 'author_id' => 4 'visits' => 32],
    ['id' => 2, 'name' => 'Post 2', 'category_id' => 1, 'author_id' => 8 'visits' => 12],
],
'2' => [
    ['id' => 3, 'name' => 'Post 3', 'category_id' => 2, 'author_id' => 12 'visits' => 201],
    ['id' => 4, 'name' => 'Post 4', 'category_id' => 2, 'author_id' => 4 'visits' => 0],
],

]
Run Code Online (Sandbox Code Playgroud)

#3

false通过在配置文件中将其设置为 ,可以简单地在 Laravel 中禁用“严格模式” database.php。虽然可能,但我不建议这样做。最好花时间学习如何编写正确的 SQL 查询,因为关闭“严格模式”给出的结果可能是不可预测的,并会导致出现问题。

参考

https://sinnbeck.dev/posts/laravel-groupby-error