Laravel Eloquent Relationships - 相当于MYSQL“加入”

时间:2017-02-27 16:35:09

标签: php mysql laravel join eloquent

似乎Laravel Eloquent关系中的所有关系都可以,它不可能让它添加INNER JOIN子句。我是否正确? whereHas子句添加WHERE EXISTS子查询,with子句预先形成“急切加载”,只是在单独的查询中加载关系。

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

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

    < / LI>
  2. 如果没有,为什么?似乎加入2个相关的表将是应该标准化的东西。我真的不知道如何添加像WHERE EXISTS这样的子查询是一个合适的替代品。 (根据我的测试,它会生成慢得多的查询....)

1 个答案:

答案 0 :(得分:4)

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

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

  1. 加入通常会调用笛卡尔积,因此很慢。当然,这还取决于您的索引以及查询优化器的工作方式
  2. 联盟不可扩展:为什么?连接在分片数据库/表分区上非常低效。一旦开始扩展到多个服务器并对数据库进行分片,就需要删除代码中的所有连接。一个很好的例子是Pinterest - 他们缩放,they had to remove all joins for sharding
  3. 当然,仍然可以使用查询构建器完成连接,但是Laravel会向开发人员强制提出问题:您真的需要加入还是有其他方式?

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