2017-04-07 31 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