Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel缓存查询_Php_Laravel_Caching - Fatal编程技术网

Php Laravel缓存查询

Php Laravel缓存查询,php,laravel,caching,Php,Laravel,Caching,简短的问题。以下工作: function something() { $this->load(['descriptions.expenses' => function ($q) use (&$transactions) { $transactions = $q->where('date', '>=', $this->user->startDate())->get(); }]); return $trans

简短的问题。以下工作:

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

问题是
返回$transactions
这似乎不会被缓存,因此稍后调用缓存键只会返回
null

我认为
cache()
上的方法,如
memberforever
memberforever
应该
缓存来自闭包的结果数据
实际上不会返回该值,您仍然需要访问该密钥来检索数据,如下所示:

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

看起来我的缓存毕竟是有效的,但我并没有让它们对每个预算都是唯一的,这意味着,对于每个预算,所有的
费用都是相同的,因为第一个被缓存了…

现在看到这一点是有意义的,至少我知道在这种情况下“出了什么问题”。在其他情况下,我是这样做的,它可以工作,但在这种情况下,它不会像您所说的那样返回实际的
$transactions
。谢谢你帮我澄清:)我现在已经重新打开(或不接受)你的答案,因为我还不清楚为什么我的例子不起作用。我以为我明白了,但我不明白,因为我更新的问题显示了一个示例,它确实按照我的预期工作。这只是一个粗略的猜测,但是,由于您在传递参数时使用了
&
,因此它可能无法将
内存位置
缓存服务
结合起来以实际插入正确的元素。疯狂的猜测我现在正在玩弄它,我想我已经明白了。因为在我看来,我实际上得到了多个
预算的
费用
,第一个返回的
费用将被缓存。因为对于特定的
预算
它是
null
,所以它也会为所有其他预算显示
null
。。。愚蠢的我:)必须使缓存对每个预算都是唯一的。谢谢你的帮助:)