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

我希望在同一个查询中使用 WHERE In 和 Groupby 来获取 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 load where id in (14,15,16) GROUP BY vehicle _ no)

167640 次浏览

这可能是一个 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,
],

长话短说

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

详细的回答

您可能不需要禁用所有 严格选项..。 关于这个问题,请看看这个 回答

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

你可以在下面找到这个设置:

Config database. php

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

每当在雄辩中使用 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')

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

不修改 config\database.php文件

config\database.php中设置 'strict' => false 可以是 安全问题。因此,一个简单的 Laravel 解决方案可以是 首先调用 ABC2,然后调用 groupBy('vehicle_no):

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

这种限制是有意义的,因为当您在 MySQL 中使用 GROUP BY时,它为 GROUP BY中使用的列中的每个值返回一行。因此,在任何地方使用所选行中的其他列的值都没有意义。因此,总是建议使用最佳实践,我建议不要禁用 MySQL 严格模式。

通常,开发人员可能需要按列值分组的查询行。在这里,它们不需要每列的唯一值只有一行。但是它们需要按特定列的唯一值分组的多个行。出于某种原因,他们使用 Laravel 的 groupBy Query Builder 方法生成一个 MySQL GROUP BY查询,开发人员遇到了上述错误。

解决这个问题的方法是使用 groupBy Collection 方法,

$loadingData = DB::table('loading')
->whereIn('id', $loadIds)
->get()
->groupBy('vehicle_no');

这将给他们带来期望的结果。

更新 config/database.php

设定:

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

而不是:

'mysql' => [
'strict' => true,
],

别忘了清除缓存:

php artisan config:cache

boot方法中加入 \Schema::defaultStringLength(191);

class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}


/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
\Schema::defaultStringLength(191);
}
}

你还不如用:

不同(「车辆」)

而不是 groupBy (‘ vehicle _ no’)每个案例场景都是不同的,但是看看您的查询,区分可能是一种方法,因为您没有聚合数据。

不需要改变任何地方在您的系统只是使用代码像在 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']);

这是在 laravel doc 8.x 上的,效果很好

 $users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();

您可以保留 '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'
],
]
SQLSTATE[42000]: Syntax error or access violation: 1055  in GROUP BY

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

'mysql' => [
'strict' => true,
'modes' => [
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION'
],
]

我通过首先获取需要排序的列然后使用 group 来解决类似的问题。

$SampleData= DB::table('tableExampleName')->get(['col1','col2'])->groupBy('col3');

然后可以 dd ()这些值并检查它们是否是正确的分组。您可以全部分配它并将其传递到视图中以进行进一步测试。

注意 : 这使用的是 Laravel 8

后来,经过一段时间的谷歌,我了解到问题是由于 sql_mode设置,并修改了 Config/database. php的配置为 strict => false

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