Reputation: 1821
I'm trying to optimize this code because it's causing Timeout problems.
It's getting all items from database and performing SUM() in PHP.
public function getInstalledCost()
{
$items = $this->stockItems()
->where('status', 'INSTALADO')
->with(['shipment' => function($q){ $q->select('id', 'item_cost'); }])
->select('id','shipment_id')
->get();
$cost = 0;
foreach($items as $i){
$cost += $i->shipment->item_cost;
}
return $cost;
}
So is there any way to get this data already SUM() from the database?
Upvotes: 0
Views: 63
Reputation: 5164
Summing a collection in Laravel could be written shorter using the sum()
method
$items->sum(function ($item) {
return count($item['item_cost']);
});
Just as a hint for later.
To sum a field of a relation you could probably do sth. like
StockItem::whereHas('shipment', function ($q) use ($shipmentId) {
$q->where('shipment_id', $shipmentId);
})->sum('shipments.item_price');
I assume you have properly set up relationships between stockItems
and shipments
and have a shipments
relation on your StockItem
model.
Upvotes: 2