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 * fromloading
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' => 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' => true
更改为'strict' => 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' => 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 关于此问题。
【讨论】:
感谢您提供出色的解决方案。这个问题杀死了我 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 错误