Laravel 急切加载与显式连接

Posted

技术标签:

【中文标题】Laravel 急切加载与显式连接【英文标题】:Laravel eager loading vs explicit join 【发布时间】:2014-08-07 21:57:09 【问题描述】:

这听起来像是一个显而易见的问题,但我只是想得到一些保证。

使用 Laravel 的快速加载功能,据我了解,它将创建 两个查询 以返回相关结果的完整列表(例如,如果您正在使用两个表)。但是,如果我错了,请纠正我,使用 join 语句将只留下 一个查询,这样可以减少到服务器数据库 (mysql) 的往返次数,并且是一种更有效的查询。

我知道你可以在 Laravel 中编写连接查询,这很棒,所以问题是:我是否错误地假设当从两个或多个表中检索相关数据时,我是否应该不用急于加载而只写我自己的加入语句?

****** 编辑 *******

一年后回到这个话题,我个人认为,只要把查询写下来,原始的,然后写好。

********* 编辑 2 *********

好吧,六年后的今天,我一直为此获得积分。

无论我是否从一开始就不清楚,与我上面所说的相反,Eloquent 在这一点上写了很好的查询。 使用 Eloquent - 即使有轻微的查询效率低下,它也可以让您编写非常清晰、可维护的代码,在我职业生涯的这一点上,我认为这在大多数情况下更为重要案例。仅在性能增强至关重要且您可以衡量影响的情况下编写原始查询并进行优化。

【问题讨论】:

你说的太对了。 Eloquent 不是为性能而生的:耸肩 【参考方案1】:

您的理解完全正确。如果您编写join 语句以使用Laravel 中的join() 连接两个或多个表,那么它只进行一个查询,而使用Eloquent 模型和eager loading 技术需要多个查询。

我是否应该不为急切加载而烦恼,而只是自己编写 连接语句

实际上,eager loading 是一种使用Eloquent ORM 轻松加载相关模型的技术,它在后台使用Query Builder,让您无需自己进行查询即可使用Eloquent Model Object,并以不同的方式表示数据,使用Eloquent ORM,您可以直接与模型交互,该模型表示数据库中具有附加功能的对象。最重要的是,它隐藏了SQL 的复杂性,并允许您使用php 代码以OOP 方式进行数据库查询。

但是当您手动调用属于Illuminate\Database\Query\Builder 类的join 方法时,您将直接使用Query Builder,这需要您编写更多代码并需要更多关于sql query 的知识,因为它不会隐藏查询来自您,但可以帮助您更准确地进行查询,但您仍然会进行查询。

两者是不同的东西,它们的工作方式也不同。您可以使用术语ORM vs Query Builder 搜索Google

【讨论】:

感谢您的洞察力!我会在这件事上做更多的研究。 我担心ORM在后台构建复杂的查询很难在系统有很多数据时优化查询数据库。

以上是关于Laravel 急切加载与显式连接的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 急切加载限制

Laravel 5.4急切加载belongsToMany关系null绑定

Laravel 急切加载与添加子句的关系?

Laravel 动态关系 - 在急切加载时访问模型属性

Laravel Eloquent 中的急切加载

Laravel 急切加载特定列错误