Eloquent Relation для таблицы элементов, которая была создана как промежуточная таблица

У меня 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.

Если моя реализация базы данных неверна и не масштабируема, я открыт для предложений.

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

Eloquent Relation для таблицы элементов, которая была создана как промежуточная таблица

Примечание: Если вы голосуете против, пожалуйста, не забудьте прокомментировать причину. За последние несколько вопросов меня минусуют без причины

@Rwd Я добавил к вопросу свои модели заказов.

mightyteja 30.07.2019 11:31

Какая из трех показанных вами таблиц относится к OrderProducts... или это вообще отдельная таблица?

Rwd 30.07.2019 11:33

@Rwd Извините за неясность, я добавил больше деталей к вопросу, надеюсь, что в приведенном выше редактировании есть вся информация :)

mightyteja 30.07.2019 11:45

Для какого стола модель OrderProducts?? Вы показали 3 стола books, order, items... это один из них или у вас тоже есть стол order_products?

Rwd 30.07.2019 11:51

забыл переименовать :( . OrderProducts представляет таблицу Items

mightyteja 30.07.2019 11:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, вам не нужно запрашивать 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( ); }

mightyteja 30.07.2019 17:47

Меня очень смущают отношения в laravel. Не могли бы вы поделиться со мной учебниками по отношениям :)

mightyteja 30.07.2019 17:49

@mightyteja Это было бы одно из лучших руководств: laracasts.com/series/eloquent-relationships, однако оно требует подписки.

Rwd 30.07.2019 21:18

Насколько я понимаю, ваша таблица товаров является сводной таблицей для заказов и книг. Итак, вы можете сделать что-то вроде этого:

Модель заказа

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

Другие вопросы по теме