2017-04-07 55 views
2

考虑下面的模型直接访问关系和在Laravel中使用有何区别?

class User { 
    public function roles() 
    { 
     return $this->hasMany('Roles'); 
    } 
} 

我可以获取用户详细信息如下

$user1 = User::find(1); 
$user2 = User::with('roles')->find(1); 

上述两种方法的工作原理相同。即使没有使用with('roles'),我仍然可以访问该特定用户的roles

echo $user1->roles; // Outputs all the roles of that user 

所以,我的问题是什么是使用with('relation')的实际差异/优势?

+0

'用户::与( '角色') - >查找(1);'当您使用'with'它被称为'EAGER LOADING'。而当你使用'$ user1->角色时,'被称为'LAZY LOADING'。参见更多信息https://laravel.com/docs/5.4/eloquent-relationships#constraining-eager-loads和https://laravel.com/docs/5.4/eloquent-relationships#lazy-eager-loading –

回答

2

with()函数用于eager loading。当加载一个用户时,这将不会有什么影响。当您尝试获取roles属性时,将执行查询以获取此用户的角色,但仅限此用户。

现在考虑从数据库中加载用户列表。当您为每个用户调用roles属性时,将为每个用户执行查询。这不是一个好的工作方式。
当您使用with()函数时,关系被急切加载。这意味着Laravel会将所有roles加载到一个查询中,并将它们分配给正确的用户对象。现在,当您拨打的用户对象roles属性,该值已经加载需要一个没有额外的数据库查询。减少查询的量为2

相关问题