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 查询