2014-09-23 3 views
5

механизма кэширования Laravel прекрасно работает при выполнении:Laravel кэширования запросов с жадной загрузкой

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

но при выполнении:

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

он не кэширует весь набор запросов, в частности, присоединиться запрос (загружаемая загрузка).

Есть ли способ кэшировать все запросы, которые выполняются в приведенном выше примере? Спасибо!

ответ

2

Вы не можете кэшировать eagler loading запросов таким образом. У вас есть 2 решения на выбор - cache::remember двигателя:

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

или построить один запрос с помощью конструктора запросов:

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

Вы должны объяснить как код отвечает на вопрос. – Cfreak

4

Вы можете сделать это рядный:

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

или в определении отношения :

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

Jarek, что делать, если соответствующая модель обновлена. Должны ли мы аннулировать весь загруженный запрос или только изменение конкретной модели? Я спросил об этом здесь [https://laracasts.com/discuss/channels/laravel/how-to-properly-do-caching-in-laravel-52]. –

+0

@AliGajani Начнем с того, что метод 'remember' был удален некоторое время назад, поэтому использование L5 + означает, что вам нужно сделать это самостоятельно. При этом вы получаете настраиваемую систему кэширования, в которой, очевидно, вы будете недействительными/обновлять соответствующие кэшированные запросы в случае обновления. Если вы основывали свой кеш на самом запросе (как это сделал метод '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

Смежные вопросы