Laravel - 真的很难理解雄辩

     2023-02-16     169

关键词:

【中文标题】Laravel - 真的很难理解雄辩【英文标题】:Laravel - Really struggling to understand eloquent 【发布时间】:2012-12-17 07:25:32 【问题描述】:

我是从 Codeigniter 过来的 Laravel 的新手,在很大程度上我真的很喜欢它,但我真的无法理解 Eloquent。

如果我想做一个这样的简单查询:

SELECT * FROM site INNER JOIN tweeter ON tweeter.id = site.tweeter_id

我尝试做这样的事情(带有“属于”):

$site = Site::with('tweeter')->find($site_id);

但现在我有两个查询和一个不需要的 IN(),如下所示:

SELECT * FROM `site` WHERE `id` = '12' LIMIT 1

SELECT * FROM `tweeter` WHERE `id` IN ('3')

所以我尝试像这样强制加入:

$site = Site::join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->find($site_id);

现在我收到这样的错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous

SQL: SELECT * FROM `site` INNER JOIN `tweeter` ON `tweeter`.`id` = `site.tweeter_id` WHERE `id` = ? LIMIT 1

Bindings: array (
  0 => 12,
)

错误在哪里很明显,哪里需要使用“site.id = ?”之类的东西。但无论如何我都看不到要发生这种情况?

所以我只是坚持回到流利和使用:

DB::table('site')->join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->where('site.id','=',$site_id)->first()

我想这不是一个大问题。我真的很想理解雄辩。我不禁觉得我弄错了,误解了它的工作原理。我错过了什么吗?还是真的必须以非常特定的方式使用它?

我想我真正的问题是:有没有办法使用 Eloquent 进行我想要进行的查询?

【问题讨论】:

【参考方案1】:

您总是可以将 Eloquent 视为 Fluent 的扩展。

您遇到的问题是由 find() 命令引起的。它使用id 没有表名,这变得模棱两可。

这是一个记录在案的问题: https://github.com/laravel/laravel/issues/1050

要创建您正在寻找的命令,您可以这样做:

$site = Site::join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->where('site.id', '=', $site_id)->first($fields);

当然,您使用 join()->find() 的语法是正确的一旦采用该问题修复程序

【讨论】:

那么使用 eloquent 有什么意义呢?这是我不太明白的。 Eloquent 的新功能完全是多余的,我还不如直接用 Fluent。 Eloquent 是一个 ORM,因此您可以像访问虚拟数据库一样访问您的代码。当您管理关系而不是像这样使用联接时,Eloquent 更有意义。 Eloquent 还允许您进行预加载,从而减少对数据库的调用量。 另请注意,ORM 并非用于最佳 sql 查询实践。这适用于所有类型的 ORM。 我最初也有同样的想法。它看起来不同,但事实并非如此。你基本上有3层。 DB::query("select * from users")、DB::table('users') 和 User::find()。他们相互交替工作,以弥补对方的不足。 (例如,我的 Eloquent 全文搜索示例:gist.github.com/4199789)如果您像编写 SQL 一样进行编程,那么您将度过一段糟糕的时光。如果你用与另一个相关的所有东西来编程,这一切都很好,兄弟。 +1 对于@JoelLarson 所说的所有内容,除了他的最后一条评论。我不同意你说的方式。这实际上取决于正在执行的操作。有时,ORM 可以输出比你想写的更优化的查询。这实际上取决于许多不同的因素。不过,这里的信息应该很简单:不要依赖或期望 ORM 输出最佳查询。始终深入挖掘并弄清楚您从什么中抽象出来。【参考方案2】:

我实际上发现这种行为是有利的。考虑一下(我将修改您的示例)。所以我们有很多站点,每个站点都有很多高音扬声器。每个站点在数据库中都有很多信息:很多列,其中一些包含大量文本/数据的文本列。

您按照自己的方式进行查询:

SELECT * FROM site INNER JOIN tweeter ON tweeter.id = site.tweeter_id

有两个缺点:

    您会获得大量冗余数据。您为同一站点的高音扬声器获得的每一行都将具有您只需要一次的相同站点数据,因此 PHP 和您的数据库之间的通信需要更长的时间。 你如何处理 foreach (tweeter_of_this_site)?我猜你会在某种列表中显示所有站点,然后在每个站点中显示所有的高音扬声器。您必须编写一些自定义逻辑来执行此操作。

使用 ORM 方法解决了这两个问题:它只获取站点数据一次,并且允许您这样做:

foreach ($sites as $site) 
    foreach($site->tweeters as $tweeter) 

我还要说的是:不要打它!我曾经说过:我为什么要使用 ORM,我可以编写自己的 SQL,谢谢.现在我在 Laravel 中使用它,非常棒!

【讨论】:

雄辩的 ORM |试图理解 Laravel 5.6 中的关系

】雄辩的ORM|试图理解Laravel5.6中的关系【英文标题】:EloquentORM|TryingtounderstandrelationsinLaravel5.6【发布时间】:2018-07-2704:54:37【问题描述】:堆栈溢出。我是PHP和Laravel的新手。我通过创建电子商务商店系统来学习它。所以问题是关... 查看详情

Laravel 雄辩的 ORM 关系

】Laravel雄辩的ORM关系【英文标题】:LaravelEloquentORMRelationship【发布时间】:2014-01-0206:17:28【问题描述】:这应该真的简单,但我似乎无法弄清楚。有两个表:`images`|-`id`|-`path`|-`name``foods`|-`id`|-`image_id`还有两种型号:classImageextend... 查看详情

Laravel 雄辩加入 ajax

】Laravel雄辩加入ajax【英文标题】:Laraveleloquentjoininajax【发布时间】:2018-10-1103:30:46【问题描述】:嗨。我怎样才能让laravel雄辩加入ajax成功功能?这是用户模型<?phpnamespaceApp;useIlluminate\\Notifications\\Notifiable;useIlluminate\\Foundation\... 查看详情

Laravel 和雄辩合集

】Laravel和雄辩合集【英文标题】:Laravelsumeloquentcollection【发布时间】:2015-03-0409:50:30【问题描述】:我如何对已预先加载的数据集求和?这是我的表结构:regionstable+------------+------------------+------+-----+---------------------+--------------... 查看详情

Laravel 雄辩的极限查询

】Laravel雄辩的极限查询【英文标题】:Laraveleloquentlimitquery【发布时间】:2020-03-2407:00:25【问题描述】:我有3个表TAble、TableB和TableC。每个都有100万个寄存器。我有Laravel雄辩的查询。$list=TableA::with([\'TableB\',\'TableC\'])->whereIn(\'fi... 查看详情

Laravel:雄辩和多列索引

】Laravel:雄辩和多列索引【英文标题】:Laravel:EloquentandMulticolumnindex【发布时间】:2019-03-2205:12:48【问题描述】:我正在使用Laravel5.7和PostgreSQL构建一个站点。问题是:是Schema::table(\'the_table\',function(Blueprint$table)$table->index([\'col... 查看详情

多重连接 laravel 雄辩

】多重连接laravel雄辩【英文标题】:multiplejoinlaraveleloquent【发布时间】:2014-07-0108:56:08【问题描述】:关于Laravel的EloquentORM的问题。我已经看过了,如果我错过了类似的问题,我深表歉意。这些是我的模型:类Formatos扩展Eloquent... 查看详情

雄辩的laravel错误

】雄辩的laravel错误【英文标题】:Eloquentlaravelerror【发布时间】:2014-04-2713:54:03【问题描述】:在laravel中,我创建了名为“Test”的模型:classTestextendsEloquentprotected$table=\'test\';然后运行composerdump-autoload然后我在控制器中使用此代... 查看详情

为啥 laravel 雄辩的关系返回空数组

】为啥laravel雄辩的关系返回空数组【英文标题】:Whylaraveleloquontrelationreturningemptyarray为什么laravel雄辩的关系返回空数组【发布时间】:2021-06-2023:58:13【问题描述】:MyRelationshipispublicfunctionQuestionOptions()return$this->hasMany(\'App\\Mode... 查看详情

Laravel 雄辩到 json

】Laravel雄辩到json【英文标题】:Laraveleloquenttojson【发布时间】:2016-05-0809:46:40【问题描述】:我在Laravel中使用vue.js。这是我的表结构:ArticleidnamedescriptionLocationidplacearticle_location(pivottable)--fields--idarticle_id(foreignkey)location_id(forei 查看详情

laravel 雄辩的关系查询

】laravel雄辩的关系查询【英文标题】:laraveleloquentquerywithrelations【发布时间】:2021-06-1715:06:51【问题描述】:我正在尝试用laraveleloquent替换mysql查询。这是我的结构。ConsumersTable---------------id,email,nameTransactionsTable-------------------id,... 查看详情

Laravel - 雄辩的自我关系

】Laravel-雄辩的自我关系【英文标题】:Laravel-EloquentSelfRelationship【发布时间】:2014-05-1412:02:40【问题描述】:我的很多模型和其他代码都在这里并且与这个问题有关:laravel-QueryBuildervs.Eloquent我有这个问题:$recipes=Recipe::whereHas(\'... 查看详情

Laravel 雄辩的嵌套

】Laravel雄辩的嵌套【英文标题】:LaravelEloquentnesting【发布时间】:2015-06-2203:36:13【问题描述】:我正在尝试返回嵌套的JSON响应,需要连接多个表,但现在,我只是尝试使用3,级别可以更深。我的模型如下:更新#1:classSportexten... 查看详情

Laravel 雄辩与条件

】Laravel雄辩与条件【英文标题】:Laraveleloquentwithandwithcondition【发布时间】:2021-12-1809:27:44【问题描述】:我正在尝试从类别中获取类别和选定项目。这是我的代码:$reqItems=$request->items;//array-selecteditem$categories=Category::where(\'ty... 查看详情

Laravel 4 雄辩的能力

】Laravel4雄辩的能力【英文标题】:Laravel4EloquentCapabilities【发布时间】:2013-09-0910:57:47【问题描述】:我是Laravel的新手,我曾经在codeigniter上工作。我对EloquentORM的概念很着迷。我有一个关于Eloquent功能的一般性问题。ORM的能力... 查看详情

带有雄辩查询的 Laravel 分页

】带有雄辩查询的Laravel分页【英文标题】:LaravelPaginationwitheloquentQueries【发布时间】:2015-01-0214:12:27【问题描述】:我正在尝试对上面有表格的模板进行分页。这是我在具有雄辩查询的控制器中的功能。publicfunctionorderbydate()$orde... 查看详情

Laravel - 节省雄辩的关系

】Laravel-节省雄辩的关系【英文标题】:Laravel-Saveoneloquentrelationship【发布时间】:2018-06-2016:01:45【问题描述】:我有3个模型User、Store、MerchantProduct。用户有很多商店Stores有很多MerchantProductMerchantProduct属于用户和商店我希望能够... 查看详情

Postgresql 到 Laravel 雄辩

】Postgresql到Laravel雄辩【英文标题】:PostgresqltoLaraveleloquent【发布时间】:2021-07-0323:36:26【问题描述】:请教我如何在laravelDB:raw()中使用COALESCE和TO_CHARSELECTMAX(COALESCE(SUBSTR("COLUMN_CODE",8),\'0\'))ASMAXFROMpublic."TABLE_ITEM"WHERECOALESCE(T 查看详情