使用Eloquent模型缓存有什么区别
$myResult = Model::remember(5)->get();
Run Code Online (Sandbox Code Playgroud)
并使用Cache
自己:
$myResult = Cache::remember('myModel', 5, function(){
return Model::get();
});
Run Code Online (Sandbox Code Playgroud)
它们是相同的,还是每个用于不同的目的?
你正在缓存同样的事情 - 但是以两种不同的方式.它们在技术上是相同的(相同的查询结果在两个示例中缓存5分钟) - 但它们与"关注点分离"问题不同.
当你处理一个模型 - 也许它在你的控制器中 - 你的控制器应该不知道模型的'内部'工作.它应该只是询问信息,并获得正确的信息.
因此,使用您的示例 - 我们有两种方法可以构建控制器:
首先 - 我们可以让控制器知道"太多"并执行此操作:
function showUser($id)
{
$myResult = Cache::remember('myModel', 5, function(){
return Model::find($id);
});
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中 - 控制器知道模型的内部工作,并且它还指示缓存应该有多长.但是控制器应该不知道用户是什么,或者应该缓存多长时间 - 最好由模型来管理.即如果你在代码中的其他地方寻找用户会发生什么 - 你必须复制你的缓存.
同时你可以这样做:
function showUser($id)
{
$user= User::getUser($id);
}
Run Code Online (Sandbox Code Playgroud)
然后在您的用户模型中
function getUser($id)
{
return User::remember(5)->find($id);
}
Run Code Online (Sandbox Code Playgroud)
这样,用户的管理保留在模型内.该模型知道应该缓存用户多长时间(如果有的话).(是的 - 有些人会说缓存应该从模型中抽象到存储库中 - 但是现在让它保持简单).在这个例子中,控制器不知道结果是否被缓存 - 但它不需要也不应该 - 它需要的只是具有id的用户$id