【发布时间】: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