在我的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);
}
但是它总是被缓存,我想定义它是否以及在控制器中缓存多长时间。由于值可能随使用而变化。
这可能吗?或者必须在模型中定义缓存,因为急切加载发生在那里?
答案 0 :(得分:3)
只需在控制器中使用with('category' => ...
即可。
您可能希望将其提取到存储库中,因此您不需要使用所有逻辑填充控制器。而且存储库现在很流行;)
搜索存储库模式以了解更多信息。
在laravel世界存储库中,主要是指对存储层的抽象(无论是db还是eloquent或其他任何东西),这将使您的控制器与您正在使用的持久性引擎分离。
更重要的是,它可以让您更轻松地测试代码。