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

问题描述 投票:40回答:5

我想在同一个查询中使用WhereIn和Group By来获取Result。

我试过这个:

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

但我收到此错误消息:

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

php laravel laravel-5
5个回答
90
投票

简短的回答

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'
        ],
 ]

详细的答案

你可能不需要禁用所有严格的选项...请关注这个answer关于这个问题。


97
投票

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

strict => false

如在

'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,
],

4
投票

我也有这个问题,但在更改'strict' => true后,'strict' => false,错误消失了。

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

配置\ database.php中

'mysql' => [
    ...
    'strict' => false,
    ...
]

2
投票

每当在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')

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


1
投票

Without modifiying config\database.php file

'strict' => false设置config\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');
© www.soinside.com 2019 - 2024. All rights reserved.