У меня 3 таблицы - Книги, Заказ, Предметы
Я сохраняю данные заказа (order_id, user_id) в таблице заказов, а идентификатор книги сохраняется в таблице «Элементы», поскольку пользователь может добавлять несколько книг.
Книги
+++++++++++++++++++++++++++++
+ id book_code name +
+++++++++++++++++++++++++++++
1 abc Book 1
2 def Book 2
порядок
+++++++++++++++++++++++++++++
+ id user_id +
+++++++++++++++++++++++++++++
1 1
Предметы
++++++++++++++++++++++++++++++++++
+ id order_id book_id quantity +
++++++++++++++++++++++++++++++++++
1 1 1 2
1 1 2 3
Я пытаюсь отобразить детали заказа и книги, забронированные под идентификатором заказа, но я запутался в использовании отношений. Я успешно могу отобразить детали заказа, поскольку все данные хранятся в таблице заказов. Но я не могу показать заказанные книги по соответствующему идентификатору заказа.
public function items()
{
return $this->hasMany(Items::class);
}
public function items()
{
return $this->hasMany(Items::class,'order_id');
}
public function user_order_details($payment_orderid)
{
// dd($payment_orderid); //payment_orderid = 1
$order_details = Orders::find($payment_orderid);
$order_products = Orders::find($payment_orderid)->items;
$books = Books::with('items')->get();
dd($books);
}
Route::get('orders', 'UserDashboardController@user_order'); // I will be fetching the user orders based on the ID from Orders table
Route::get('orders/{payment_orderid}', 'UserDashboardController@user_order_details'); // Here I would like to show the details related to the order
Я могу получить результаты, но я не уверен, как изолировать результаты от order_id.
Если моя реализация базы данных неверна и не масштабируема, я открыт для предложений.
Короче говоря, я пытаюсь показать детали книги для соответствующего заказа.
Примечание: Если вы голосуете против, пожалуйста, не забудьте прокомментировать причину. За последние несколько вопросов меня минусуют без причины
Какая из трех показанных вами таблиц относится к OrderProducts... или это вообще отдельная таблица?
@Rwd Извините за неясность, я добавил больше деталей к вопросу, надеюсь, что в приведенном выше редактировании есть вся информация :)
Для какого стола модель OrderProducts?? Вы показали 3 стола books, order, items... это один из них или у вас тоже есть стол order_products?
забыл переименовать :( . OrderProducts представляет таблицу Items






Во-первых, вам не нужно запрашивать Order второй раз, поскольку вы уже получили его в строке выше, т.е.
$order_details = Orders::find($payment_orderid);
$order_products = Orders::find($payment_orderid)->items;
может быть:
$order_details = Orders::find($payment_orderid);
$order_products = $order_details->items;
Во-вторых, если вы хотите получить books с заказом, вы можете либо установить отношения belongsToMany на своей модели Order, либо отношения hasOne на своей модели Items (или и то, и другое).
Принадлежит ко многим
Добавьте следующее к вашей модели Orders:
public function books()
{
return $this->belongsToMany(Books::class, 'items')
->withPivot('quantity')
->withTimestamps();
}
Затем в вашем контроллере вы можете сделать:
$order_details = Orders::find($payment_orderid);
$books = $order_details->books; //Each book with have a `pivot` property than contains the quantity.
HasOne
В вашу модель Items вы можете добавить следующее:
public function book()
{
return $this->hasOne(Books::class);
}
Затем в вашем контроллере вы можете использовать нетерпеливая загрузка для получения предметов и книг:
$order_details = Orders::with('items.book')->find($payment_orderid);
$order_products = $order_details->items;
В приведенном выше примере каждый order_product будет иметь свойство books, т.е.
foreach ($order_products as $order_product) {
$order_product->book->name;
}
Большое спасибо, братан, потребовалось некоторое время, чтобы заставить решение работать. Я продолжил BelongsToMany. Мне пришлось добавить order_id, чтобы заставить решение работать с общедоступными книгами функций() { return $this->belongsToMany(Books::class, 'order_products', 'order_id') ->withPivot('quantity') ->withTimestamps( ); }
Меня очень смущают отношения в laravel. Не могли бы вы поделиться со мной учебниками по отношениям :)
@mightyteja Это было бы одно из лучших руководств: laracasts.com/series/eloquent-relationships, однако оно требует подписки.
Насколько я понимаю, ваша таблица товаров является сводной таблицей для заказов и книг. Итак, вы можете сделать что-то вроде этого:
Модель заказа
public function books()
{
return $this->belongsToMany('App\Book', 'items',
'order_id', 'book_id');
}
Предметы — сводная таблица.
В контроллере:
public function user_order_details($payment_orderid)
{
$order_details = Orders::find($payment_orderid);
foreach ($order_details->books as $product)
{
echo $product->name;
}
}
@Rwd Я добавил к вопросу свои модели заказов.