[英]Does laravel cache all query results?
laravel / eloquent會記住以前的查詢結果嗎?或者它會多次訪問相關模型而不是將值放入變量中,是否會對性能產生影響:
$user = User::find(1);
doSomething($user->relation->id)
doSomethingElse($user->relation->id)
與
$user = User::find(1);
$relatedModelId = $user->relation->id
doSomething($relatedModelId)
doSomethingElse($relatedModelId)
如果您僅使用一個具有關系的對象,則無需更改代碼。
但是,如果要加載具有關系的對象的集合,則需要使用緊急加載來避免N + 1問題。
當訪問Eloquent關系作為屬性時,關系數據是“延遲加載”的。 這意味着直到您首次訪問該屬性,關系數據才被實際加載。 但是,Eloquent可以在查詢父模型時“急於加載”關系。 積極的加載減輕了N + 1查詢問題。
https://laravel.com/docs/5.5/eloquent-relationships#eager-loading
因此,使用with()
方法來預加載所有相關數據:
$users = User::with('relation')->get();
雄辯地緩存關系,因此您無需如所示將關系分配給變量。 請記住使用有效的關系大小寫-否則,每次執行新查詢時,例如:
$user = User::find(1);
doSomething($user->relation->id);
doSomethingElse($user->relation->id);
僅對關系執行單個查詢,但
$user = User::find(1);
doSomething($user->relation->id);
doSomethingElse($user->RELATION->id);
可能為此關系執行2個查詢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.