Laravel:在多个级别加载对象

时间:2019-06-25 14:08:33

标签: php laravel

我有下表:

订单:ID等...

order_lines :id,order_id,product_id等...

产品:ID,名称等...

定义了外键。

我的Laravel模型定义为:

feof
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'));
    }

产品对象未加载。我想在上面的循环中显示产品名称。

4 个答案:

答案 0 :(得分:2)

尝试这样做:

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

答案 1 :(得分:0)

你好,Dezaley,欢迎您来StackOverflow! 让我们调查您的问题。 据我所知,您选择的模型是错误的。让我来帮助您

$order = Order::where(['id' => $id, 'user_id' => $user->id])->with('orderLine.product')->firstOrFail();

答案 2 :(得分:0)

非常热心帮助我的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始终为null。


Class OrderLine extends Model {
     public $product = null

我删除了“ public $ product = null”行,它按预期工作。感谢帮助我的人们。

答案 3 :(得分:0)

尝试一下-

    @foreach($order as $ordr)
    <tr>
    <td>{{$ordr->product_id->name}}</td>
    <tr>
    @endforeach