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

Posted

技术标签:

【中文标题】Laravel:语法错误或访问冲突:1055 错误【英文标题】:Laravel : Syntax error or access violation: 1055 Error 【发布时间】:2017-04-16 11:27:52 【问题描述】:

我想在同一个查询中使用 WhereIn 和 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 loading where id in (14, 15, 16) group by vehicle_no)

【问题讨论】:

切换你的 groupBy 和 whereIn 语句 它不工作@aynber 你能打印完整的错误信息吗? SQLSTATE[42000]: 语法错误或访问冲突: 1055 'sbrtpt.loading.id' 不在 GROUP BY 中(SQL: select * from loading where id in (14, 15, 16) 分组vehicle_no) @aynber laracasts.com/discuss/channels/eloquent/… 【参考方案1】:
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'
    ],
]

【讨论】:

【参考方案2】:

您可以离开'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'
    ],
 ]

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

感谢这就像魅力 \DB::statement("SET SQL_MODE=''"); 谢谢,一直在搜索和尝试所有其他解决方案,但对我不起作用。您的解决方案很简单且有效。非常感谢 我很高兴@KyusufMuhammad 先生和 Vinit Kadkol 先生。 谢谢,工作就像一个魅力 谢谢@SkBindas,它也对我有用。另外我认为这是最好的解决方案,因为它不会改变全局设置。【参考方案5】:

不修改config\database.php文件

config\database.php 中设置'strict' =&gt; 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' => false 时我无法得到正确的结果。如果您在查询时尝试分组数据,则此解决方案效果很好。谢谢你的回答。【参考方案6】:

你不妨使用:

distinct('vehicle_no')

每个案例场景都不同,而不是 groupBy('vehicle_no'),但是查看您的查询,不同的可能是要走的路,因为您没有聚合数据。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

更新config/database.php

设置:

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

代替:

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

别忘了清除缓存:

php artisan config:cache

【讨论】:

除了在 2016 年得到回复,如果我能投票给你一千次,我会的。在没有任何线索的情况下敲打它大约 24 小时。爱你的男人 【参考方案9】:

这个限制是有意义的,因为当您在 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');

这会给他们想要的结果。

【讨论】:

【参考方案10】:

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

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

config\database.php

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

【讨论】:

我们如何在 laravel 中为 oracle 连接做到这一点【参考方案11】:

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

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

【讨论】:

添加 ->select('column') 对我有用。谢谢哥们:)【参考方案12】:

简答

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

设置'strict' =&gt; false 禁用所有。

.... 或

您可以离开'strict' =&gt; 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 关于此问题。

【讨论】:

感谢您提供出色的解决方案。这个问题杀死了我 3 个小时 如何在 laravel 中的 oracle 连接上将此严格模式设置为 false?请帮帮我 这成功了!!!对于更改该设置后仍然出现相同错误的任何人,请尝试通过运行 php artisan config:cache 来清除配置缓存 我对这种硬编码的解决方法的担忧是,我觉得某种技术债务不会让我晚上睡个好觉,因为那种会浮现在我脑海中的问题会就像:当 Laravel 和/或 MySQL 规范更改 modes 时会发生什么(例如,添加/删除该数组中指定的某些模式,或者更糟糕的是,该数组中指定的模式之一的名称更改) .所以,我只是离开strict=true,不会碰任何mode 的东西。我宁愿更新我的代码以使用如此严格的设置。 ThisPractice === SleepWellEveryNight :) 更好的解决方案是编写更好的 SQL【参考方案13】:

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

【讨论】:

在这种方法中可以产生任何安全问题@Antonio Carlos Ribeiro 我相信它是安全的,否则你将无法在 Laravel 上禁用它。 应用更改后不要忘记执行此命令:php artisan config:cache

以上是关于Laravel:语法错误或访问冲突:1055 错误的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误

Laravel 迁移语法错误或访问冲突 1064

Laravel 6 - SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;

Laravel 7 迁移:语法错误或访问冲突:1068 定义了多个主键