Laravel缓存查询

时间:2019-01-24 13:01:06

标签: php laravel caching

简短而简单的问题。下面的作品:

function something() {
    $this->load(['descriptions.expenses' => function ($q) use (&$transactions) {
        $transactions = $q->where('date', '>=', $this->user->startDate())->get();
    }]);

    return $transactions;
}

它按预期返回所有费用。当我缓存它时,就像这样:

function something() {
    return cache()->rememberForever('budget_expenses_' . auth()->user()->id, function () {
        $this->load(['descriptions.expenses' => function ($q) use (&$transactions) {
            $transactions = $q->where('date', '>=', $this->user->startDate())->get();
        }]);

        return $transactions;
    });
}

它立即不返回任何内容。我只是好奇为什么会这样。缓存它的原因显然是因为它会生成很多查询。

以下内容也可以按预期工作:

function something() {
    return cache()->rememberForever('something_' . auth()->user()->id, function () {
        return auth()->user()->budgets()->get();
    });
}

问题在于return $transactions;似乎没有被缓存,因此以后调用缓存的密钥将仅返回null

2 个答案:

答案 0 :(得分:1)

我认为cache()上的方法,例如rememberrememberForever应该cache the resulting data from the closure并未实际返回该值,您仍然需要访问该键才能检索数据,像这样:

cache()->rememberForever('budget_expenses_' . auth()->user()->id, function () {
    $transactions = /* Something */;

    $this->load(['descriptions.expenses' => function ($q) use (&$transactions) {
        $transactions = $q->where('date', '>=', $this->user->startDate())->get();
    }]);

    return $transactions;
});

return cache('budget_expenses_' . auth()->user()->id);

答案 1 :(得分:0)

似乎我的缓存毕竟还在工作,但是我并没有使它们对于每个预算都是唯一的,这意味着,对于每个预算,所有expenses都是相同的,因为第一个被缓存了...