2016-06-13 22 views
5

我經過laravel文檔「負載」之間的不同,我沒有得到之間的不同隨着查詢負載,在這種條件下,我們需要使用有或負載?請描述它什麼是「有」,並在laravel

Model::find(1)->with('firstModel','SecondModel'); 

Model::find(1)->load('firstModel','SecondModel'); 
+0

您的問題已回覆http://stackoverflow.com/questions/26005994/laravel-with-method-versus-load-method –

回答

1

在堅果殼中,with()同時加載與父母模型的關係。這是急切的負載。

如果您不想急於加載該數據,則可以使用延遲加載或急切延遲加載。在這種情況下,當你真正開始使用關係時,數據將被加載。所以,你可以在運行時決定你想究竟是什麼關係加載或也許你不會想在所有的等

2
Model::find(1)->with('firstModel','SecondModel'); 

加載任何關係數據是不是真的做任何事情,因爲with是一個新的現在建造者與find(1)返回的模型無關。

Model::with(....)->find(1); 

渴望加載關係。

Model::find(1)->load(...); 

是懶惰渴望加載。它將關係加載到您已經檢索的現有模型實例。 (因爲find(1)正在返回Model實例,並且load告訴它然後加載指定的關係) load也可以用於集合以加載所有包含的Model實例上的關係。 load在處理一組模型時與單個模型相比更加有用,因爲只使用動態屬性(延遲加載,如果尚未加載的話)模型上的關係會導致運行相同的查詢。在一個集合中,它會在遍歷它們時刪除任何N + 1問題。

你可以看看這篇文章的更多信息。

asklagbox - blog - Eloquent Querying Relations

1

with()加載在同一時間父模型。當你需要Lazy Eager Loading時使用。

$books = App\Book::all(); 

if ($someCondition) { 
    $books->load('author', 'publisher'); 
} 

如果您需要在預先加載查詢中設置附加查詢的限制,你可以通過一個封閉的加載方法:例如,如果你需要動態決定是否加載相關的模型,這可能是有用的:

$books->load(['author' => function ($query) { 
    $query->orderBy('published_date', 'asc'); 
}]);