2014-09-23 30 views
5

il meccanismo di caching laravel funziona bene quando si fa:laravel query nella cache con eager loading

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

, ma quando si fa:

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

esso non memorizza nella cache l'intero set di query, in particolare il join query (caricamento ansioso).

C'è un modo per memorizzare nella cache tutte le query eseguite nell'esempio precedente? Grazie!

risposta

2

Non è possibile memorizzare le query eagler loading in questo modo. Hai 2 soluzioni tra cui scegliere - cache::remember motore:

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

o costruire singola query utilizzando query builder:

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

si dovrebbe esplodere come il codice risponde alla domanda. – Cfreak

4

si può fare in linea:

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

o nella definizione relazione :

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

Jarek, cosa succede se un modello correlato viene aggiornato. Dovremmo invalidare l'intera query caricata con entusiasmo o solo il cambio di modello specifico? Ho chiesto questo su [qui] (https://laracasts.com/discuss/channels/laravel/how-to-properly-do-caching-in-laravel-52) pure. –

+0

@AliGajani Iniziamo col fatto che il metodo 'remember' è stato rimosso qualche tempo fa, quindi usare L5 + significa che devi farlo da solo. Detto questo, si finisce con il sistema di caching personalizzato in cui ovviamente si invalida/aggiorna le query memorizzate nella cache in caso di aggiornamento. Se hai basato la tua cache sulla query stessa (come ha fatto il metodo 'remember'), allora devi invalidare solo quella relativa alla tabella correlata, che è stata aggiornata. –

Problemi correlati