【发布时间】:2014-12-02 09:05:08
【问题描述】:
在我的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);
}
但是它总是会被缓存,我想定义它是否缓存在控制器中以及缓存多长时间。因为值可能会随使用而变化。
这可能吗?还是必须在模型中定义缓存,因为急切加载发生在那里?
【问题讨论】:
-
只需在控制器中使用
with('category' => ...。 -
昨晚我做了一些测试,得出了同样的结论。我注意到我最终做了很多不必要的组件关系加载。感谢您对此的意见:)
-
不客气。不过,您可能希望将其提取到存储库中,因此您不会在控制器中填充所有这些逻辑。如今,存储库很流行;)
-
我见过这个表达式弹出,但我不熟悉它(在 git 世界之外)。看起来我还有一些研究要做,再次感谢 :) 哦,当我的网站启动时,我会添加一个指向您的 SOFTonSOFA 网站的链接,很棒的 Eloquent 资源竖起大拇指
-
搜索存储库模式以了解更多信息。在 laravel 世界中,存储库主要是指对存储层的抽象(无论是 db 和 eloquent 还是其他任何东西),这将使您的控制器与您正在使用的持久性引擎分离。 更重要的是,它可以更轻松地测试您的代码。
标签: php caching laravel laravel-4 eloquent