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

Laravel : Syntax error or access violation: 1055 Error

我想在同一个查询中使用 WhereIn 和 Groupby 来获取结果。

我试过这个:

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

但我收到此错误消息:

SQLSTATE[42000]: Syntax error or access violation: 1055 'sbrtpt.loading.id' isn't in GROUP BY (SQL: select * from loading where id in (14, 15, 16) group by vehicle_no)

这可能是一个 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 选项... 请查看有关此问题的answer

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

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

config\database.php

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

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

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

不修改config\database.php文件

config\database.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');

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

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

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

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

这会给他们想要的结果。

更新config/database.php

设置:

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

而不是:

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

别忘了清除缓存:

php artisan config:cache

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

你不妨使用:

不同的('vehicle_no')

而不是 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 文档 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'
    ],
]

我通过首先获取我需要排序的列然后使用分组依据解决了使用分组依据的类似问题。

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

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

注意:这是使用Laravel 8.

后来google了一下,得知是sql_mode设置的问题,修改config/database.php的配置为strict => false .

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