Laravel: загружайте объекты на многих уровнях - PullRequest
3 голосов
/ 25 июня 2019

У меня есть следующие таблицы:

заказы : идентификатор и т. Д. *

строки заказа : идентификатор, идентификатор заказа, идентификатор продукта и т. Д. ...

продукты : идентификатор, имя и т. Д. *

Внешние ключи определены.

Мои модели Laravel определены как:

class Order

 public function orderLine()
    {
        return $this->hasMany('App\OrderLine');
    }
class OrderLine

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

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

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

Я много чего пробовал, но ничего не получается. Вот лучшее решение для меня, но оно не работает.

class OrderController

public function show($id)
    {
        $user = Auth::user();
        $order = Order::where('user_id', '=', $user->id)->with(['orderLine.product'])->findOrFail($id);
        return view('layouts/order/index', compact('order'));
    }

Я изо всех сил пытаюсь отобразить следующие данные в представлении:

@foreach($order->orderLine as $key => $orderLine)
<tr>
    <td>{{$orderLine->product->name}}</td>
<tr>
@endforeach

Объект продукта не загружен. Я хочу отобразить название продукта в вышеуказанном цикле.

Ответы [ 4 ]

2 голосов
/ 25 июня 2019

Попробуйте сделать так:

public function show($id)
    {
        $user = Auth::user();
        $order = Order::with(['orderLines', 'orderLines.product'])
                      ->where('user_id', '=', $user->id)
                      ->findOrFail($id);
        return view('layouts/order/index', compact('order'));
    }
class OrderLine

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

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

 public function orderLines()
    {
        return $this->hasMany(\App\OrderLine::class);
    }

Измените имя orderLine на orderLines, потому что в заказе много строк OrderLines.

И в вашем клинке:

@foreach($order->orderLines as $orderLine)
<tr>
    <td>{{$orderLine['product']->title}}</td> 
<tr>
@endforeach
0 голосов
/ 26 июня 2019

попробуй -

    @foreach($order as $ordr)
    <tr>
    <td>{{$ordr->product_id->name}}</td>
    <tr>
    @endforeach
0 голосов
/ 26 июня 2019

Ответ от mare96, который был очень дружелюбным, чтобы помочь мне, работает. Однако я кое-что узнал.

Вы можете реализовать как (решение mare96)


public function show($id)
    {
        $user = Auth::user();
        $order = Order::with(['orderLines', 'orderLines.product'])
                      ->where('user_id', '=', $user->id)
                      ->findOrFail($id);
        return view('layouts/order/index', compact('order'));
    }

@foreach($order->orderLines as $orderLine)
<tr>
    <td>{{$orderLine['product']->title}}</td> 
<tr>
@endforeach

В представлении мне не нравится синтаксис массива "$ orderLine ['product'] -> title". Следующее решение без массива также работает.

Решение ниже:


public function show($id)
    {
        $user = Auth::user();
        $order = Order::with('orderLines', 'orderLines.product')
                      ->where('user_id', '=', $user->id)
                      ->findOrFail($id);
        return view('layouts/order/index', compact('order'));
    }

@foreach($order->orderLines as $orderLine)
<tr>
    <td>{{$orderLine->product->title}}</td> 
<tr>
@endforeach

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


Class OrderLine extends Model {
     public $product = null

Я удаляю строку "public $ product = null", и она работает как положено. Спасибо людям, которые помогли мне.

0 голосов
/ 25 июня 2019

Привет Дезалей и добро пожаловать в StackOverflow! Давайте исследуем вашу проблему. Насколько я вижу, вы выбираете модель неправильно. Позвольте мне помочь вам:

$order = Order::where(['id' => $id, 'user_id' => $user->id])->with('orderLine.product')->firstOrFail();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...