Laravel 5.4 борется с отношениями

Мне нужна помощь с отношениями Laravel 5.4.

У меня есть 4 таблицы:

пользователи (поля: id, имя и т. д.)

профили (поля: id, user_id, first_name, last_name)

заказы (поля: id, user_id и т. д.) order_items (поля: id, order_id, product_id и т. д.)

Пользователь может иметь один профиль

Профиль может иметь одного пользователя

Пользователь может иметь много заказов

Заказ у одного пользователя

В заказе может быть много позиций

В моделях у меня есть:

Пользователь:

public function profile()
{
    return $this->hasOne('App\Profile');
}

public function orders()
{
    return $this->hasMany('App\Order');
}

Профиль:

public function user()
{
    return $this->belongsTo('App\User');
}

Порядок:

public function user()
{
    return $this->hasOne('App\User');
}

public function order_items()
{
    return $this->hasMany('App\OrderItem');
}

заказЭлемент:

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

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

У меня есть два вопроса:

1. Когда я показываю заказ, я хочу показать столбцы first_name и last_name из таблицы profiles.

В своем контроллере я сделал так: $user = User::find($order->user_id);

На мой взгляд: {{ $user->profile->fullName() }}

Есть ли способ получить имя непосредственно в представлении, а не сначала извлекать пользователя в контроллере?

2.

В моей модели заказа:

Когда я просматриваю заказ, я хочу отобразить все элементы заказа и название продукта (продукт- > имя) для каждого элемента.

Я очень запутался и не знаю, как это сделать.

В моем контроллере я пробовал: 1.

$items = Order::find($order->id)->order_items->with('product');

Получил ошибку: Попытка получить свойство не-объекта

2. $items = Order::find($order->id)->order_items;

    foreach($items as $item) {
        echo $item->product->name;
    }

Получил ошибку:

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «products.order_item_id» в «предложении where» (SQL: выберите * из products, где products.order_item_id = 1 и products.order_item_id не является нулевым пределом 1)


person Sigal Zahavi    schedule 27.03.2017    source источник


Ответы (2)


  1. Вам не нужно ничего делать на виду.

В вашей модели заказа вам необходимо создать связь с пользовательской таблицей следующим образом:

public function user(){
    return $this->belongsTo(User::class);
}

Для просмотра вам просто нужно написать что-то вроде этого: {{ $order->user->profile->fullName() }}

  1. Если вы не упомянули взаимосвязь между product и orderItems. Для отношения, которое вы упомянули выше, таблица products должна иметь столбец order_item_id. Тогда достаточно только этого утверждения:

$items = Order::find($order->id)->order_items

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

$items = $order->order_items

потому что у вас уже есть объект $order, поэтому вам не нужно снова запрашивать id.

person Imran    schedule 27.03.2017
comment
Спасибо, я не понимаю, зачем мне добавлять order_item_id в таблицу products. Таблица products имеет идентификатор, а таблица order_items имеет product_id, который является отношением. $order-›order_items не возвращает название продукта, как мне получить название продукта? - person Sigal Zahavi; 28.03.2017
comment
Хорошо, удалось заставить это работать: в моей модели продукта у меня есть один заказ, а в моем заказе у меня есть принадлежность к продукту. Теперь $order-›order_items также дает мне название продукта. Спасибо - person Sigal Zahavi; 28.03.2017

  1. ты можешь сделать

    Profile::where('user_id', $order->user_id)->first();
    
  2. Do

     Order::with('order_items.product')->find($order->id);
    

это должно сработать для вас

person oseintow    schedule 27.03.2017
comment
Спасибо, но для заказа с продуктами я получаю эту ошибку: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «products.order_item_id» в «предложении where» (SQL: выберите * из products, где products.order_item_id в (1 , 2)) - person Sigal Zahavi; 28.03.2017