laravel 缓存 return 0
laravel caching return 0
我正在尝试缓存计算不同类别用户数量的请求
我的函数没有缓存:
public function getNumOfUsersInCat()
{
$numUsers = count($this -> users);
$otherCategories = Category::where('id', '<>', $this -> id) -> get();
foreach($otherCategories as $categ){
if($this -> isAncestorOf($categ))
$numUsers += count($categ -> users);
}
return $numUsers;
}
我试图缓存这样的请求:
public function getNumOfUsersInCat()
{
$numUsers = count($this -> users);
$otherCategories = Cache::remember('cache_numuserscat)',60*60*12,function(){
return
Category::where('id', '<>', $this -> id) -> get();
foreach($otherCategories as $categ){
if($this -> isAncestorOf($categ))
$numUsers += count($categ -> users);
}
});
return $numUsers;
}
但我只得到 0
Laravel 5.7.2
这是因为您已将计算循环放入缓存中,并且在到达该部分之前,您 return 使用了类别列表。所以你 运行 的代码实际上是这样的:
public function getNumOfUsersInCat()
{
$numUsers = count($this -> users);
$otherCategories = Cache::remember('cache_numuserscat)', 60*60*12, function(){
return Category::where('id', '<>', $this -> id) -> get();
});
return $numUsers;
}
在正确的代码之前,有几点需要注意:
- 你的缓存名称应该只适用于你所在的这个模型,所以我在名称中添加了
$this->id
。
- 您可以使用
withCount
在单个查询中获取所有模型用户的计数。你的方法有 N+1 个问题。
最终代码可以是这样的:
public function getNumOfUsersInCat()
{
$cacheName = "cache_num_users_cat_" . $this->id;
return Cache::remember($cacheName, 60 * 60 * 12, function() {
$numUsers = count($this->users);
$otherCategories = Category::query()
->where('id', '<>', $this->id)
->withCount('users')
->get();
foreach ($otherCategories as $categ) {
if ($this->isAncestorOf($categ)) {
$numUsers += $categ->users_count;
}
}
return $numUsers;
});
}
我正在尝试缓存计算不同类别用户数量的请求
我的函数没有缓存:
public function getNumOfUsersInCat()
{
$numUsers = count($this -> users);
$otherCategories = Category::where('id', '<>', $this -> id) -> get();
foreach($otherCategories as $categ){
if($this -> isAncestorOf($categ))
$numUsers += count($categ -> users);
}
return $numUsers;
}
我试图缓存这样的请求:
public function getNumOfUsersInCat()
{
$numUsers = count($this -> users);
$otherCategories = Cache::remember('cache_numuserscat)',60*60*12,function(){
return
Category::where('id', '<>', $this -> id) -> get();
foreach($otherCategories as $categ){
if($this -> isAncestorOf($categ))
$numUsers += count($categ -> users);
}
});
return $numUsers;
}
但我只得到 0
Laravel 5.7.2
这是因为您已将计算循环放入缓存中,并且在到达该部分之前,您 return 使用了类别列表。所以你 运行 的代码实际上是这样的:
public function getNumOfUsersInCat()
{
$numUsers = count($this -> users);
$otherCategories = Cache::remember('cache_numuserscat)', 60*60*12, function(){
return Category::where('id', '<>', $this -> id) -> get();
});
return $numUsers;
}
在正确的代码之前,有几点需要注意:
- 你的缓存名称应该只适用于你所在的这个模型,所以我在名称中添加了
$this->id
。 - 您可以使用
withCount
在单个查询中获取所有模型用户的计数。你的方法有 N+1 个问题。
最终代码可以是这样的:
public function getNumOfUsersInCat()
{
$cacheName = "cache_num_users_cat_" . $this->id;
return Cache::remember($cacheName, 60 * 60 * 12, function() {
$numUsers = count($this->users);
$otherCategories = Category::query()
->where('id', '<>', $this->id)
->withCount('users')
->get();
foreach ($otherCategories as $categ) {
if ($this->isAncestorOf($categ)) {
$numUsers += $categ->users_count;
}
}
return $numUsers;
});
}