Запросите красноречивую связь с более чем одним столбцом

Играем с красноречивыми отношениями laravel. У меня есть эти отношения.

Заказ:

id
id_customer

Заказ.php

public function orderDetails(){
    return $this->hasMany('App\OrderDetail', 'order_id');
}

Деталь заказа

id
order_id
product_id
quantity

Модель Детали Заказа

 public function product()
{
   return $this->hasMany('App\Product', 'id', 'id');
}

public function order(){
  return $this->belongsTo('App\Order', 'order_id', 'id');
}

Товар

id name price

Когда dd'ed dd($this->order->with('orderDetails')->get();

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

Какой запрос мне выполнить или лучший способ определить мои отношения?


person Bernard 'Beta Berlin' Parah    schedule 04.01.2017    source источник
comment
нет имени, я не вижу столбец имени??!!   -  person aimme    schedule 04.01.2017
comment
продукт имеет столбец имени   -  person Bernard 'Beta Berlin' Parah    schedule 04.01.2017
comment
Просто отредактировал его, чтобы показать правильно.   -  person Bernard 'Beta Berlin' Parah    schedule 04.01.2017


Ответы (2)


Используйте вложенную активную загрузку:

$this->order->with('orderDetails', 'orderDetails.product')->get();

Отношение должно быть belongsTo(), но не hasMany():

public function product()
{
    return $this->belongsTo('App\Product', 'product_id', 'id');
}

Кроме того, здесь можно использовать отношения «многие ко многим». Но только если он подходит.

person Alexey Mezenin    schedule 04.01.2017
comment
Я попробовал это, и orderDetails представляет собой пустой массив. - person Bernard 'Beta Berlin' Parah; 04.01.2017
comment
Вы изменили отношение? $this->order->with('orderDetails', 'orderDetails.product')->get(); вам подходит? - person Alexey Mezenin; 04.01.2017
comment
$this->order->with('orderDetails')->get(); на самом деле дает мне подробную информацию, включая идентификатор продукта. Но я не знаю, как получить название продукта - person Bernard 'Beta Berlin' Parah; 04.01.2017
comment
Если вы будете использовать with('orderDetails') и попытаетесь получить название продукта, вы встретите Проблема с запросом N+1 - person Alexey Mezenin; 04.01.2017
comment
@BernardParah спасибо за отзыв, я отредактировал код в своем ответе. - person Alexey Mezenin; 04.01.2017

просто для всех, кто посещает этот вопрос в качестве справки, поскольку вы просили предложить предложение об отношениях, вот способ, которым я мог бы достичь этого, и мое мнение.

на самом деле его продукты принадлежат многим заказам, а заказы принадлежат многим продуктам. я вижу, что деталь заказа является сводной. вы также можете создать модель для этого, если хотите.

products таблица

id
customer_id

Продукт.php

public function orders()
{
    return $this->belongsToMany(Order::class, 'order_details', 'order_id', 'product_id')->withPivot('quantity');
}

orders таблица

id
name
price

Заказ.php

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

я мог бы не создавать OrderDetail, так как нет надежной ссылки на таблицу. только таблица order_details

id
order_id
product_id
quantity

но если бы я создал модель OrderDetail, вот как это было бы

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

public function orders()
{
    return $this->hasMany(Order::class, 'order_id');
}
person aimme    schedule 04.01.2017