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;
    });
}