Laravel результат объединения двух отношений, которые указывают на одну таблицу - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть orders_products таблица. Для отношений один ко многим. Один заказ может иметь несколько продуктов. И каждая лицензия уникальна для заказанного продукта. Потому что каждая лицензия генерируется уникально для данного продукта.

Таблица orders_products имеет идентификатор заказа, идентификатор продукта и идентификатор лицензии. Это связано с тем, что все заказы имеют связанный продукт и соответствующую лицензию.

enter image description here

В модели Order у меня есть следующие отношения:

class Order extends Model {

public function products()
{
    return $this->belongsToMany(Product::class, 'orders_products', 'order_id', 'product_id');
}

public function licenses()
{
    return $this->belongsToMany(License::class, 'orders_products', 'license_id');
}
}

Но теперь я бы хотел, чтобы лицензии отображались в объектах продукта. Потому что они связаны. Итак, каким-то образом эти отношения необходимо объединить?

При извлечении данных:

$data = Order::with('products', 'licenses')->get();

Результат неполный:

"data": [
    {
        "id": 1, <!-- id of the orders table
        "user_id": "2",
        "products": [
            {
                "id": 1,
                "name": "Product 1",
                "price": "100.0",
                "license": null <-- here I would like to licenses relation to kick in
            },
            {
                "id": 2,
                "name": "Product 2",
                "price": "100.0",
                "license": null
            }
        ],
        "payed_at": "2020-02-21 17:07:49",
        "payed": true
    }
]

}

Как вы можете видеть, данные о товаре заполняются правильно. Но лицензии прилагаются отдельно. Но они должны быть частью продукта.

Так как объединить результаты столбцов product_id и license_id из таблицы order_products таблицы?

Обновление:

Я думаю, что решение каким-то образом заключается в вызове license () для модели Product.

"products": [
            {
                "id": 1,
                "name": "Developer Forms Plugin",
                "price": "100.0",
                "license": {
                    "id": null,
                    "license": null,
                    "slots": null
                }
            }]

Таков должен быть результат. Лицензия является уникальной для каждого заказанного продукта. Просто иметь лицензию на каждый продукт недостаточно. Они генерируются для каждого заказанного товара.

1 Ответ

0 голосов
/ 21 февраля 2020

Я думаю, вам нужно что-то вроде:

$data = Order::with('products.license')->get();

Таким образом, мы можем получить лицензию, связанную с продуктами. Я назвал лицензию, потому что вы описали отношение один к одному между ними, поэтому я предположил, что вы написали это в единственном числе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...