Laravel通过急切加载缓存查询

Jon*_*nas 5 mysql caching laravel eloquent laravel-4

在执行以下操作时,Laravel缓存机制可以正常工作:

$users = User::remember(10)->get();
Run Code Online (Sandbox Code Playgroud)

但在做的时候:

$users = User::with('posts','addresses')->remember(10)->get();
Run Code Online (Sandbox Code Playgroud)

它不会缓存整个查询集,特别是连接查询(eager loading).

有没有办法缓存上面示例中执行的所有查询?谢谢!

Jar*_*zyk 5

您可以内联进行:

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

或在关系定义中:

public function posts()
{
  return $this->hasMany('Post')->remember(10);
}
Run Code Online (Sandbox Code Playgroud)


小智 2

您无法以这种方式缓存eagler 加载查询。您有 2 个解决方案可供选择 - cache::remember引擎:

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

或使用查询生成器构建单个查询:

...->select(...)->join(...)->where(...)->remember(...)
Run Code Online (Sandbox Code Playgroud)