【发布时间】:2015-01-16 14:59:11
【问题描述】:
情景
一个订单可以有多个订单行。每个订单行可以有许多产品。然后可以为每个产品分配一个许可证(但仅在订单完成后)。许可证将分配给单个用户。澄清一下,从技术上讲,每个订单行可以有一个或多个产品,并且没有,行上每个产品的一个或多个许可证。
型号
- OrderHeader(id、状态、货币...)
- OrderLine (id, order_header_id, total, ....)
- 产品(id、name、parent_id)
- 许可证(id、user_id、product_id、order_line_id)
- 用户(ID、姓名、电子邮件、...)
还有一个 order_line_product 表,其中有 order_line_id 和 product_id 字段。
因此,订单包含 OrderHeader 表中的一条记录,以及 OrderLine 表中的许多记录,这些记录通过 order_line_product 表链接到 Product。许可证是单独添加的,但具有引用 User 和 OrderLine 的相关字段。
要求
我想按以下格式输出日期:
OrderHeader
- OrderLine 1
- Product 1
- Licence 1
- User 1
- Licence 2
- User 2
- Product 2
- Licence 3
- User 3
- OrderLine 2
- Product 1
- OrderLine 3
- Product 1
- Product 2
- Licence 4
- User 4
- Product 3
关键是我想返回一个以这种方式正确加载关系的集合。
模型中的关系代码
订单页眉
public function lines()
{
return $this->hasMany('App\OrderLine', 'order_header_id', 'id');
}
订单行
public function header()
{
return $this->belongsTo('App\OrderHeader', 'order_header_id');
}
public function products()
{
return $this->belongsToMany('App\Product');
}
public function licences()
{
return $this->hasMany('App\Licence');
}
产品
public function orderLine()
{
return Product::belongsToMany('App\OrderLine');
}
public function licence()
{
return Product::belongsToMany('App\Licence');
}
许可证
public function user()
{
return Licence::belongsTo('App\User');
}
public function line()
{
return Licence::belongsTo('App\OrderLine', 'order_line_id');
}
public function product()
{
return Licence::hasOne('App\Product', 'id', 'product_id');
}
希望一切都按预期进行。
当前代码
如果我使用:
$order = OrderHeader::findOrFail($id)->load('lines.products', 'lines.licences.user', 'creator');
它非常接近我想要的输出,所有正确的数据都存在,但是“许可证”关系没有嵌套在“产品”关系中。如果我输出数据,它将采用以下格式:
OrderHeader
- OrderLines
- Products
- Product 1
- Product 2
- etc...
- Licences
- Licence 1
- User
- Licence 2
- User
- etc...
即许可证与产品处于同一层次结构,而不是嵌套在其中。
我想要的是:
OrderHeader
- OrderLines
- Products
- Product 1
- Licences
- Licence 1
- User
这将使我能够非常轻松地遍历订单的完整层次结构,而无需进行混乱的 foreach / if 检查。
谢谢!
【问题讨论】: