2014-09-23 5 views
5

der Laravel Caching-Mechanismus funktioniert gut, wenn tun:Laravel Caching-Abfragen mit dem eifrigen Laden

$users = User::remember(10)->get(); 

aber wenn dabei:

$users = User::with('posts','addresses')->remember(10)->get(); 

es nicht die gesamte Menge von Abfragen zwischenspeichert, speziell die Verbindung Abfrage (eifrig laden).

Gibt es eine Möglichkeit, alle Abfragen, die im obigen Beispiel ausgeführt werden, zwischenzuspeichern? Danke!

Antwort

2

Sie können eagler loading Abfragen nicht auf diese Weise zwischenspeichern. Sie haben zwei Lösungen zur Auswahl - cache::remember Motor:

$users = Cache::remember('custom_cache_key', 10, function() { 
    return User::with('posts', 'addresses')->get(); 
}); 

oder einzelne Abfrage mit Query Builder bauen:

...->select(...)->join(...)->where(...)->remember(...) 
+0

sollten Sie expl ain wie der Code die Frage beantwortet. – Cfreak

4

Sie können es inline:

User::with(['posts' => function ($q) { 
    $q->remember(10); 
}, 'addresses' => function ($q) { 
    $q->remember(10); 
}])->remember(10)->get(); 

oder in der Beziehung Definition :

public function posts() 
{ 
    return $this->hasMany('Post')->remember(10); 
} 
+0

Jarek, was passiert, wenn ein verwandtes Modell aktualisiert wird. Sollten wir die gesamte geladene Abfrage oder nur den spezifischen Modellwechsel ungültig machen? Ich fragte dies auch auf [hier] (https://laracasts.com/discuss/channels/laravel/how-to-properly-do-caching-in-laravel-52). –

+0

@AliGajani Beginnen wir damit, dass die "Remember" -Methode vor einiger Zeit entfernt wurde, also bedeutet L5 +, dass man sie alleine machen muss. Nichtsdestoweniger haben Sie am Ende ein benutzerdefiniertes Caching-System, bei dem Sie offensichtlich im Cache befindliche Abfragen im Falle einer Aktualisierung ungültig machen/aktualisieren. Wenn Sie Ihren Cache auf die Abfrage selbst basieren (wie 'remember' Methode), dann müssen Sie nur die eine gegen verwandte Tabelle ungültig machen, die aktualisiert wurde. –

Verwandte Themen