【问题标题】:Laravel caching queries with eager loadingLaravel 使用预加载缓存查询
【发布时间】:2014-11-17 15:58:02
【问题描述】:

Laravel 缓存机制在这样做时可以正常工作:

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

但是在做的时候:

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

它不会缓存整个查询集,特别是连接查询(急切加载)。

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

【问题讨论】:

    标签: mysql caching laravel laravel-4 eloquent


    【解决方案1】:

    你可以内联:

    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);
    }
    

    【讨论】:

    • Jarek,如果相关模型更新了怎么办。我们应该使整个急切加载的查询无效还是仅使特定的模型更改无效?我也在here 上问过这个问题。
    • @AliGajani 让我们从一个事实开始,remember 方法在前一段时间被删除了,所以使用 L5+ 意味着你需要自己做。话虽如此,您最终会得到自定义缓存系统,显然您会在更新时使适当的缓存查询无效/刷新。如果您的缓存基于查询本身(就像remember 方法所做的那样),那么您只需要使已更新的相关表无效。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你应该解释一下代码是如何回答这个问题的。
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2012-07-06
    • 2014-12-23
    • 2015-05-02
    • 2016-07-11
    • 2014-11-30
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多