1

A cargo has many orders. An order has a quantity and a price. For every order in a cargo, I want to return the sum of quantity * price as a single value.

A cargo collection returns data as:

{
    "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",
    }
}

I have tried using an Eloquent Accessor in the Cargo class as:

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;
    }
}

But product_margin returns 0. How can I get this working?

1 Answer 1

2

This $this->orders() return hasmany relationship data. To get the item collection from relationship data you should use get(). Update the code in your Cargo modal.

    public function getProductMarginAttribute() {
        $orders = $this->orders()->get();
        $total = 0;

        foreach ($orders as $order) {
            $total += $order['qty'] * $order['price'];
        }

        return $total;
    }
Sign up to request clarification or add additional context in comments.

Comments

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.