【问题标题】:How to avoid multiple foreach loop in laravel如何避免laravel中的多个foreach循环
【发布时间】:2021-08-24 13:50:56
【问题描述】:

我正在使用查询从数据库中获取数据。获取后,我为每个对象添加了一个额外的属性,但为此我必须使用三个 foreach 循环,我想避免那个 foreach 循环。我该怎么做呢

这是我的查询代码

$invoices = Invoice::when(!empty($request->customer_id), function ($q) use ($request) {
      return $q->where('customer_id', $request->customer_id);
    })->where('start_date', '>=', $request->start_date)->whereDate('end_date', '<=', $request->end_date)->when(!empty($request->rate_zone_id), function ($q) use ($request) {
      $q->whereHas('consignments_invoices.charges', function ($query) use ($request) {
        $query->where('rate_zone_id', $request->rate_zone_id);
      });
    })->withCount(['consignments_invoices'])->with(['customers:id,name', 'invoice_totals', 'consignments_invoices.charges'])->get();

这里我在 foreach 循环的帮助下在对象中添加了一个属性

foreach ($invoices as $invoice) {
        $invoice->setAttribute('rate_zone_income','');
        if (!empty($request->rate_zone_id)) {
        $rate_zone_income = 0;
        foreach ($invoice->consignments_invoices as $consignment) {

          foreach ($consignment->charges as $charge) {
            if ($charge->rate_zone_id == $request->rate_zone_id) {
              $rate_zone_income += $charge->income;
            }
          }
        }
        $invoice->setAttribute('rate_zone_income',$rate_zone_income);
      }
    }

【问题讨论】:

  • 为什么你认为嵌套循环有问题?您有多个托运的发票,因此您需要使用嵌套循环。收费也是如此。
  • 我想通过查询来管理它,因为如果有数千条记录,这将需要时间
  • 如果速度很慢,问题出在其他地方(可能在 SQL 查询中),而不是在嵌套循环中。

标签: php laravel eloquent laravel-query-builder


【解决方案1】:

为什么不使用accessors

class Invoice extends Model
{
    // ...
    public function getRateZoneIncomeAttribute($rateZoneId = null)
    {
        if (empty($rateZoneId)) {
            return '';
        }

        return $invoice->consignments_invoices->reduce(function($rate_zone_income, $consignment) {
            return $cosignment->charges->reduce(function($rate_zone_income, $charge) {
                if ($charge->rate_zone_id == $rateZoneId) {
                    $rate_zone_income += $charge->income;
                }
                return $rate_zone_income;
            }, $rate_zone_income);
        }, 0);
    }
    // ...
}

【讨论】:

  • $request 变量将在发票模型中未定义
  • 哦,对了,我更新了我的答案,这样你就可以这样传递了:$invoice-&gt;rateZoneIncome($rateZoneId);
  • $charge 也未定义
  • 哦,我忘了加这个reduce()。我更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2020-06-15
相关资源
最近更新 更多