Php 在调用模型方法时删除太多查询

Php 在调用模型方法时删除太多查询,php,laravel,duplicates,Php,Laravel,Duplicates,因此,我按如下方式加载所有预算: $budgets = auth()->user()->budgets()->get(); // With some eager loading and ordering, not needed for this example. 问题在于我执行某些检查的方式。以这个片段为例: @foreach($budgets as $budget) if($budget->getRemainingAmount() < 1) // ge

因此,我按如下方式加载所有预算:

$budgets = auth()->user()->budgets()->get(); // With some eager loading and ordering, not needed for this example.
问题在于我执行某些检查的方式。以这个片段为例:

@foreach($budgets as $budget)

    if($budget->getRemainingAmount() < 1) // getRemainingAmount() performs 6 queries
        class="danger"
    @endif

@endforeach
现在,我们只说该方法做了以下简单的事情:

public function getRemainingAmount()
{
    return 100;
}
现在,在执行查询时,如何将getRemainingAmount方法分配给名为$remaining的变量?或者,有没有更好的方法来解决这个问题?在我看来,我只想改变这一点:

if($budget->getRemainingAmount() < 1)
例如:

if($remaining < 1)
这样我就可以多次执行检查,而不必在每次调用该方法时反复运行6个查询


有没有关于如何以简单的方式实现这一点的想法?事实上,我现在有多个方法导致了同一个问题,我的调试栏显示:执行了66条语句,其中41条重复,25条是唯一的。显然,我想删除重复项。

您可能会对使用缓存存储重复查询结果感兴趣

您甚至可以将闭包作为默认值传递。调查结果 如果指定的项不存在于中,则将返回闭包 隐藏物通过传递闭包,可以推迟检索默认值 来自数据库或其他外部服务的值:

您可以控制缓存结果的时间,它可以显著提高性能并减少数据库负载

对你来说,访问一些预算结果

将运行一次查询,以后每次访问该缓存项时,都会得到相同的结果,而不会再运行其他查询


我以前确实使用过缓存,也许我应该使用它。所以,谢谢你的回答:
if($remaining < 1)
$value = Cache::get('key', function () {
    return DB::table(...)->get();
});
$result = Cache::get('some-budget-result', function () {
    return auth()->user()->budgets()->doSomethingToAssignThatMethodToSomeVariable()->get();
});