Laravel:语法错误或访问违规:1055错误



我想在同一查询中使用groupby来获取结果。

我已经尝试过:

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

但是我收到了此错误消息:

sqlstate [42000]:语法错误或访问违规:1055'sbrtpt.loading.id''不在组中(sql:sef:select *从加载中select *从(14、15、16)组中的ID中的ID中的ID,walle_no)

简短答案

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

详细答案

您可能不需要禁用所有严格选项...请查看有关此问题的答案。

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

无需更改系统中的任何地方使用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']);

而无需修改configdatabase.php文件

configdatabase.php中设置'strict' => false 可以是安全问题。因此,一个简单的Laravel解决方案可以是第一个调用get(),然后 groupBy('vehicle_no)

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

您可以离开'strict' => true并将模式添加到" mysql"选项in。

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

更新config/database.php

set:

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

而不是:

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

,不要忘记清除缓存:

php artisan config:cache

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

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

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

您可以在:

中找到此设置

config database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]
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'
    ],
]

稍后,在谷歌搜索一段时间后,我了解到问题是由sql_mode设置引起的,并修改了 config/database.php 的配置为strict => false

请参阅:https://stdworkflow.com/147/laravel-syntax-error-eror-ccess-violation-1055-error

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

通常,开发人员可能需要按列值分组的查询行。在这里,他们不需要一行根据列的唯一值。但是他们需要由特定列的唯一值分组的多行。由于某种原因,他们使用 groupBy查询构建器的Laravel方法,该方法生成MySQL GROUP BY查询,而开发人员会遇到上述错误。

解决他们问题的解决方案是使用groupBy收集方法。例如,

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

这将为他们带来理想的结果。

您也可以使用:

独特('warter_no')

而不是groupby('warter_no')每个情况方案都不同,但是查看您的查询可能是因为您没有汇总数据,这可能是要走的方式。

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

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

Schema::defaultStringLength(191);添加到boot方法

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);
    }
}

我解决了与使用组的使用相似的问题,首先要进行排序,然后使用组。

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

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

NOTE :这是使用 Laravel 8

相关内容

  • 没有找到相关文章

最新更新