0

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?

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

3 Comments

your first hint returns count(): Parameter must be an array or an object that implements Countable
your second tip needs shipmentId which is not my case. My StockItem class belongsTo() Shipment class
Well, for the first you need to check what is inside your $item and need to replace with the correct field. This is more or less an example.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.