Laravel 中带有连接的嵌套预加载
Nested Eager Loading with Joins in Laravel
我有以下 Table 和他们的关系
产品Table:
id product_name product_price
1 Product A 2 USD
2 Product B 3 USD
组件Table
id component_name component_price
1 Component A 5 USD
2 Component B 3 USD
product_component 枢轴 Table
id component_id product_id
1 1 1
2 1 2
3 2 2
订单Table
id order_date
1 "2015-05-06"
order_items TABLE
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
我认为我的方向是正确的,但需要指导才能生成所需的报告。
您可以按如下方式预先加载嵌套关系:
Order::with('items.products')->get();
我能够使用以下方法解决此问题:
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
我有以下 Table 和他们的关系
产品Table:
id product_name product_price
1 Product A 2 USD
2 Product B 3 USD
组件Table
id component_name component_price
1 Component A 5 USD
2 Component B 3 USD
product_component 枢轴 Table
id component_id product_id
1 1 1
2 1 2
3 2 2
订单Table
id order_date
1 "2015-05-06"
order_items TABLE
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
我认为我的方向是正确的,但需要指导才能生成所需的报告。
您可以按如下方式预先加载嵌套关系:
Order::with('items.products')->get();
我能够使用以下方法解决此问题:
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