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


89

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

我已经试过了:

$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:从*中加载*,从(14,15,16)组中的ID按Vehicle_no分组)


切换您的groupBy和whereIn语句
aynber '16

它不起作用@aynber
Karthikvijayaveni's

您可以打印完整的错误消息吗?
2016年

SQLSTATE [42000]:语法错误或访问冲突:1055'sbrtpt.loading.id'不在GROUP BY中(SQL:从(14,15,16)group by中的loading位置选择* )@aynberidvehicle_no
Karthikvijayaveni

Answers:


199

简短答案

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

详细答案

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


2
感谢您的出色解决方案。这个问题杀死了我3个小时
Sarower Jahan

我们如何在laravel中的oracle连接上将此严格模式设置为false?请帮助我
Vikas Chauhan

@VikasChauhan,对不起,我以前没有使用过Oracle
Husam,

2
这有效!!!对于更改该设置后仍然出现相同错误的任何人,请尝试运行以下命令清除配置缓存:php artisan config:cache
Altin

我对这种硬编码的解决方法感到担心的是,我感到某种技术上的欠债无法使我晚上入睡,因为那种浮现在脑海中的问题会像是:当Laravel和/或MySQL规范更改modes(例如,添加/删除该数组中指定的某些模式,或者更糟的是,该数组中指定的其中一种模式的名称发生更改)。所以,我只是离开strict=true,不会碰任何mode东西。我宁愿更新代码以在如此严格的设置下工作。ThisPractice === SleepWellEveryNight:)
Damilola Olowookere

105

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

1
用这种方法可以发出任何安全问题@Antonio Carlos Ribeiro
Karthikvijayaveni

我相信它是安全的,否则您不会在Laravel上选择禁用它。
安东尼奥·卡洛斯·里贝罗

7

无需修改config \ database.php文件

设置'strict' => falseconfig\database.php可能是安全问题。因此,可以先调用get()groupBy('vehicle_no)一个简单的Laravel解决方案,然后再执行以下操作

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

当'strict'=> false时,我无法获得正确的结果。如果您在查询时尝试分组数据,则此解决方案效果很好。谢谢你的回答。
ireshan pathirana

6

每当雄辩地使用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')的添加对我有用。谢谢哥们:)

5

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

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

config \ database.php

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

我们如何能做到这一点的Oracle connectiion在laravel
维卡斯肖汉

3

更新 config/database.php

组:

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

代替:

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

并且不要忘记清除缓存:

php artisan config:cache

如果我能在2016年投票给你,我将在2016年得到答复。敲打它大约24小时,没有任何线索被缓存。爱你的男人<3
Faisal Mehmood Awan

2

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

开发人员通常可能需要按列的值分组的查询行。在这里,它们不需要为每一列的唯一值仅需要一行。但是它们需要按特定列的唯一值分组的多行。由于某种原因,他们使用groupByLaravel的Query Builder方法生成MySQLGROUP BY查询,并且开发人员遇到上述错误。

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

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

这将给他们期望的结果。


0

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

0

您最好使用:

与众不同('vehicle_no')

每个案例的情况都与groupBy('vehicle_no')不同,但是在查询中,由于您不汇总数据,因此与众不同可能是一种解决方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.