在Laravel中使用联接嵌套的Eager加载

时间:2015-04-29 12:49:14

标签: eloquent laravel-5 eager-loading

我有以下表格及其关系

产品表:

id    product_name    product_price
1     Product A       2 USD
2     Product B       3 USD

组件表

id   component_name    component_price
1    Component A       5 USD
2    Component B       3 USD 

product_component Pivot Table

id component_id       product_id
1  1                  1
2  1                  2
3  2                  2

订单表

id    order_date
1     "2015-05-06"

order_items表

id order_id component_id  quantity
1  1          1             1
2  1          2             2

订单模型

class Order extends Model {

    public function items()
    {
        return $this->hasMany('OrderItem');
    }

}

OrderItem模型:

class OrderItem extends Model {

    public function orders()
    {
        return $this->belongsTo('Order');
    }

}

产品型号

class Product extends Model {

    public function components()
    {
        return $this->belongToMany('Component');
    }

}

组件模型

class Component extends Model {

    public function products()
    {
        return $this->hasOne('Product');
    }

}

产品组件模型

class ProductComponent extends Model {

    public function products()
    {
        return $this->belongsTo('Product')->withPivot();
    }

    public function components()
    {
        return $this->belongsTo('Component')->withPivot();
    }
}

查看

    <h3>Order Id : {{ $order->id }} </h3>
    <h3>Order Date : {{ $order->order_date }} </h3>

@foreach($order->items as $item)
    <tr>
        <td>{{ $item->component_name }}</td>
        <td>{{ $item->component_price }}</td>

    </tr>
@endforeach

我的控制器:

public function show($id)
    {

        $order = Order::with(array('items' => function($query) 
                    {
                        $query->join('components AS c', 'c.id', '=', 'order_items.component_id');
                    }))
                    ->find($id);

        return view('orders', compact('order'));
    }

我只能使用上面的代码生成以下报告

Order No : 1
Order Date : 2015-05-06

Component A    5 USD

Component B    3 USD

但是,我需要使用以下格式的订单报告,其中包含每个产品组件的产品详细信息。

Order No : 1
Order Date : 2015-05-06

Component A   

 - Product A   2 USD  
 - Product B   3 USD
   Total       5 X 1 = 5 USD

Component B    3 USD

 - Product B   3 USD
   Total       3 X 2 = 6 USD

我认为我的方向正确,但需要指导才能生成所需的报告。

2 个答案:

答案 0 :(得分:2)

您可以按如下方式加载嵌套关系:

Order::with('items.products')->get();

答案 1 :(得分:0)

我能够使用以下方法解决这个问题:

class OrderItem extends Model {

    public function orders()
    {
        return $this->belongsTo('Order');
    }

    public function products()
    {
        return $this->component->belongsToMany('App\Models\Product\Product');
    }

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

控制器:

$order = Order::with(array('items' => function($query) 
                    {
                        $query->with('products')
                        ->join('product_components AS c', 'c.id', '=', 'product_order_items.component_id')
                        ;
                    }))
                    ->find($id);

查看:

<h3>Order Id : {{ $order->id }} </h3>

<h3>Order Date : {{ $order->order_date }} </h3>

@foreach($order->items as $item)
    <tr>
        <td>{{ $item->component_name }}</td>
        <td>{{ $item->component_price }}

        @foreach($item->products AS $product)
            <li>{{ $product->name }}</li>
        @endforeach
        </td>
    </tr>
@endforeach