Laravel Eloquent 关系——相当于 MYSQL “join”

Posted

技术标签:

【中文标题】Laravel Eloquent 关系——相当于 MYSQL “join”【英文标题】:Laravel Eloquent Relationships -- equivalent of MYSQL "join" 【发布时间】:2017-07-18 08:56:16 【问题描述】:

似乎在 Laravel Eloquent 关系所能做的所有事情中,都不能让它添加一个 INNER JOIN 子句。我这样做对吗? whereHas 子句添加一个 WHERE EXISTS 子查询,with 子句执行“急切加载”,仅在单独的查询中加载关系。

显然,在很多情况下INNER JOIN 会比运行一堆查询更有效率方式,所以我为这些查询编写了一个join 子句。

    是否可以使用 eloquent 关系来定义 join 子句,这样我就不必在每次同时使用 2 个表时重写相同的连接查询?

    如果不是,为什么?似乎加入 2 个相关的表应该是标准化的。我真的看不出添加像WHERE EXISTS 这样的子查询是一个合适的替代品。 (根据我的测试,它生成的查询慢得多......)

【问题讨论】:

laravel.com/docs/5.4/queries#joins @Jackowski -- 感谢您的快速回复。我知道您可以手动将join 子句添加到每个需要它的查询中。我的问题是是否可以在 Laravel“模型”中定义关系,然后引用它以自动包含 join 子句,而不是每次都手动输入。 (如果不可能,我想知道为什么这在 Laravel 中不是标准的,因为它似乎应该是从相关表中获取数据的标准方式。) 【参考方案1】:

就像@Jackowski 指出的那样,joins can be performed using the query builder

关于为什么 Laravel 框架使用多个查询与连接(例如加载关系),这是因为连接通常很昂贵,原因如下:

    连接通常会调用笛卡尔积,因此速度很慢。当然,这也取决于您的索引以及查询优化器的工作方式 联接不可扩展:为什么?连接在分片数据库/表分区上非常非常低效。一旦您开始扩展到多台服务器并对数据库进行分片,您就需要删除代码中的所有连接。 Pinterest 就是一个很好的例子——随着规模的扩大,they had to remove all joins for sharding

当然,连接仍然可以使用查询构建器完成,但 Laravel 将问题强加给开发人员:你真的需要连接还是有其他方法?

免责声明:泛泛而谈是危险的,您应该始终考虑您的具体用例

【讨论】:

以上是关于Laravel Eloquent 关系——相当于 MYSQL “join”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 相当于 QueryBuilder 查询

Laravel Eloquent - 相当于第一个()?

Laravel 关系上的枢轴关系 (Eloquent)

如何在 Laravel/Eloquent 中获得完整的关系

深入理解 Laravel Eloquent——模型间关系(关联)

laravel 返回与 eloquent 和 laravel 的关系