使用Laravel和Eloquent在模型中加载缓存关系(使用$ with)

时间:2014-10-07 20:14:24

标签: php caching laravel laravel-4 eloquent

在我的Article模型中,我急切地在模型中加载类别关系:

protected $with = array('category');

当我在控制器中收到我的文章时,我会缓存我的文章和我急切加载的关系的结果:

$articles = Article::with([
   'owner' => function ($q) {$q->remember(10);},
   'tags' => function ($q) {$q->remember(10);},
   'thumbnail' => function ($q) {$q->remember(10);}
   ])
   ->remember(10)->get();

但; article.category不会被缓存。我认为它会与Article模型一起缓存,因为它在该模型中急切加载。但这不会发生。

如果我通过将其添加到我的Article::with中来加载控制器(带缓存),它会被缓存:

'category' => function ($q) {$q->remember(10);}

我知道我可以remember()关系本身:

public function category()
{
    return $this->belongsTo('Category', 'category_id')->remember(10);
}

但是它总是被缓存,我想定义它是否以及在控制器中缓存多长时间。由于值可能随使用而变化。

这可能吗?或者必须在模型中定义缓存,因为急切加载发生在那里?

1 个答案:

答案 0 :(得分:3)

只需在控制器中使用with('category' => ...即可。

您可能希望将其提取到存储库中,因此您不需要使用所有逻辑填充控制器。而且存储库现在很流行;)

搜索存储库模式以了解更多信息。

在laravel世界存储库中,主要是指对存储层的抽象(无论是db还是eloquent或其他任何东西),这将使您的控制器与您正在使用的持久性引擎分离。

更重要的是,它可以让您更轻松地测试代码。