2016-03-09 18:38:57 5681次浏览 2条回答 0 悬赏 10 金钱

Yii的joinWith设计的是先关联查询出主模型的数据,再分开查询其它表的数据,为什么这么设计,既然都JOIN了,为什么不一次性SELECT出来呢?

  • 回答于 2016-03-10 10:12 举报

    为了实现贪婪加载。

    // 查找所有订单并以客户 ID 和订单 ID 排序,并贪婪加载 "customer" 表
    $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all();
    

    文档上有说明 :http://www.yiichina.com/doc/guide/2.0/db-active-record
    这里有对joinWith的说明,也有对贪婪加载的说明

    2 条回复
    回复于 2016-03-10 17:07 回复

    我看过文档,文档上只是说了怎么使用,没说为什么这么设计,如果说是贪婪加载的话,那它第一次join查询的时候,直接把副表的字段select出来然后再整理不就可以了?为什么还要分开再查一次?我说为什么这么设计?

    回复于 2016-03-10 17:24 回复


    为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。他节省了服务器的内存开销,从而提高了服务器的性能。
    如果你明确了解自己要查询的数据是需要立即加载的,那你就关闭贪婪加载,他这个设计是为了有些时候,关联的数据你未必就需要用到,而真正使用到的时候,再去查询。

    ps: 以上是我个人理解,不敢说理解一定是对的,仅供参考。因为我觉得这个设计跟java中hibernate的延迟加载应该是一个意思。
    至于为什么要这么设计,估计作者才清楚,或者说真正对这个功能有体会的人才比较明白他的好处。

  • 回答于 2016-03-11 16:25 举报

    现在都追求效率,直接join效率还不如多个小查询

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
YiiNewer
经理

YiiNewer

注册时间:2014-10-12
最后登录:2018-07-18
在线时长:46小时16分
  • 粉丝13
  • 金钱530
  • 威望70
  • 积分1690

热门问题