Un cargo
tiene muchos orders
. Un order
tiene una quantity
y un price
. Para cada order
en un cargo
, quiero devolver la suma de quantity * price
como un valor único.
Una colección de cargo
devuelve datos como:
{ "data": { "cargo_id": 4, "name": "Cargo Name", "qty": "366200.00", "cost": 140, "product_id": 1, "product": { "id": 1, "name": "Sample Product" }, "orders": [ { "id": 1, "cargo_id": 4, "qty": 14200, "price": "500" }, { "id": 4, "cargo_id": 4, "qty": 12000, "price": "500" }, { "id": 6, "cargo_id": 4, "qty": 5600, "price": "500" } ], "comments": "sample", } }
He intentado usar un Eloquent Accessor en la clase Cargo
como:
namespace App; use Illuminate\Database\Eloquent\Model; class Cargo extends Model { protected $guarded = []; protected $appends = [ 'product_margin' ]; public function orders() { return $this->hasMany(Order::class); } public function getProductMarginAttribute() { $orders = $this->orders(); $total = 0; foreach ($orders as $order) { $total += $order['qty'] * $order['price']; } return $total; } }
Pero product_margin
devuelve 0
. ¿Cómo puedo hacer que esto funcione?
Este $this->orders()
devuelve muchos datos de relación. Para obtener la colección de elementos de los datos de relación, debe usar get()
. Actualiza el código en tu modal Cargo
.
public function getProductMarginAttribute() { $orders = $this->orders()->get(); $total = 0; foreach ($orders as $order) { $total += $order['qty'] * $order['price']; } return $total; }