Laravel:语法错误或访问冲突:1055错误

Kar*_*eni 51 php laravel laravel-5

我想在Same Query中使用WhereIn和Groupby来获取Result.

我试过这个:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

SQLSTATE [42000]:语法错误或访问冲突:1055'sbrtpt.loading.id'不在GROUP BY中(SQL:select*from loading其中id为(14,15,16)group by vehicle_no)

Hus*_*sam 117

简短的回答

config\database.php- > "mysql"数组

设置'strict' => false为禁用所有.

.... 要么

您可以保留'strict' => true并添加模式到"mysql"选项中

'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',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]
Run Code Online (Sandbox Code Playgroud)

详细的答案

您可能不需要禁用所有严格选项...请仔细阅读有关此问题的答案.

  • 感谢您提供出色的解决方案。这个问题扼杀了我的 3 个小时 (4认同)
  • 这有效!对于更改该设置后仍然遇到相同错误的任何人,请尝试通过运行 php artisan config:cache 来清除配置缓存 (4认同)
  • 我对这种硬编码解决方法的担忧是,我感到某种技术债务不会让我晚上睡个好觉,因为我脑海中浮现的问题如下:当 Laravel 和/或MySQL规范更改了“模式”(例如,添加/删除该数组中指定的某些模式,或者更糟糕的是,该数组中指定的模式之一的名称发生变化)。所以,我只保留 `strict=true` 并且不会触及任何 `mode` 的东西。我宁愿更新我的代码以适应如此严格的设置。`这个练习 === 每晚睡得好`:) (4认同)
  • 更好的解决方案是编写更好的 SQL (2认同)

Ant*_*iro 101

这可能是一个SQL_MODE问题.在你的config/database.php,在连接中,改变

strict => false
Run Code Online (Sandbox Code Playgroud)

如在

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],
Run Code Online (Sandbox Code Playgroud)


ces*_*pon 14

无需修改config\database.php文件

设置'strict' => falseconfig\database.php可能是一个安全问题。所以,一个简单的 Laravel 解决方案可以先调用get(),然后groupBy('vehicle_no)

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');
Run Code Online (Sandbox Code Playgroud)


Gou*_*lfy 14

更新config/database.php

放:

'mysql' => [
     'strict' => false,
],
Run Code Online (Sandbox Code Playgroud)

代替:

'mysql' => [
     'strict' => true,
],
Run Code Online (Sandbox Code Playgroud)

并且不要忘记清除缓存:

php artisan config:cache
Run Code Online (Sandbox Code Playgroud)


小智 12

无需更改系统中的任何位置,只需使用 laravel 中的代码

\DB::statement("SET SQL_MODE=''");//this is the trick use it just before your query

$data=Task::where('user_id', Auth::user()->id)->where('status', 0)->groupBy('task_code')->get(['id','task_code', 'title']);
Run Code Online (Sandbox Code Playgroud)


Chr*_*kwo 12

您可以将'strict' => true模式保留并添加到“mysql”选项中。

'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)


小智 6

每当在 eloquent 中使用 groupBy 时,请始终在 select() 函数中包含 groupBy 函数中使用的列名。

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
Run Code Online (Sandbox Code Playgroud)

在配置文件中禁用严格模式也是一种不好的做法。这样做可能会导致损坏的数据进入数据库,例如没有任何警告的无效日期。除非绝对必要,否则不要这样做。


小智 6

SQLSTATE[42000]: Syntax error or access violation: 1055  in GROUP BY
Run Code Online (Sandbox Code Playgroud)

如果出现上述错误,请将以下内容添加到文件夹database.php中的文件中config

SQLSTATE[42000]: Syntax error or access violation: 1055  in GROUP BY
Run Code Online (Sandbox Code Playgroud)


小智 6

后来google了一下才知道是设置导致的问题,将config/database.phpsql_mode的配置修改为。strict => false

参考: https: //stdworkflow.com/147/laravel-syntax-error-or-access-violation-1055-error


小智 5

我也遇到了这个问题,但是将更 'strict' => true改为后 'strict' => false,错误消失了。

您可以在以下位置找到此设置:

config \ database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
Run Code Online (Sandbox Code Playgroud)