Laravel Eloquent Relationships —— 相当于 MYSQL “join”

Ske*_*ets 2 php mysql join laravel eloquent

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

显然,有很多地方的情况下INNER JOIN将是方式比运行一堆查询的效率更高,所以我写了join这些查询子句。

  1. 是否可以使用雄辩的关系来定义join子句,这样我就不必每次将 2 个表一起使用时都重写相同的连接查询?

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

Par*_*ras 5

就像@Jackowski 指出的那样,可以使用查询构建器执行连接

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

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

当然,连接仍然可以使用查询构建器来完成,但 Laravel 向开发人员提出了一个问题:你真的需要连接还是有其他方法?

免责声明:一般性是危险的,您应该始终考虑您的特定用例