我的Laravel代码运行缓慢,因为foreach,我应该将查询更改为chunk吗?以及如何对其进行优化



这个概念很简单,我想对来自具有相同工作名称的表分析的一些名称为total_hs的值求和。由于foreach if有大量数据,因此此代码运行速度非常慢。

public function totalHSBySameName()
{
$result = Analysis::selectRaw('workingname')->get();
$name = [];
$total = [];

foreach ($result as $i) {
if (!in_array($i->workingname, $name)) {
$name[] = $i->workingname;
}
}
foreach ($name as $i) {
$temp = 0;
$x = Analysis::selectRaw('workingname,total_hs')
->where('workingname', $i)
->get();
foreach ($x as $j) {
$temp += $j->total_hs;
}
$total[] = ["name" => $i, 'total_hs' => $temp];
}
return $total;
}

对于像这样的型号

namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Analysis extends Model
{
use HasFactory;
protected $analysis;
public $table = 'analysis';
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at';
protected $fillable = [
'workingname',
'code',
'koef',
'total_hs',
'created_by',
'updated_by',
];
}

如果我理解,您希望为每个workingname返回total值。你可以用我下面提到的新功能来替换你的功能。所以,这可能会有所帮助:

public function totalHSBySameName() {
$result = Analysis::groupBy('workingname')
->selectRaw('sum(total_hs) as sum, workingname')
->pluck('sum','workingname');
return $result;
}

尝试这个

public function totalHSBySameName()
{
$total = Analysis::query()
->groupBy('workingname')
->selectRaw('sum(total_hs) as sum, workingname')
->pluck('sum', 'workingname');
return $total;
}

最新更新