TP5的关联应用
参考TP5的多对多关联文档,给大家简单介绍一下我在项目应用中的实现。
- ER图讲解多对多关系
如图绘出“订单——票据”联系,记为“O-T”联系;图中Order实体和Ticket各画了5个属性作为展示,业务需要不同属性也一定不一致,这点大家可根据业务场景自行设计;其中Ticket实体大家可联系成商品,就好比我们购物下单时,一笔订单可包含各种各样的商品,这里我的订单中所有的商品都是票据,一笔订单包含多张票据。
- 数据表
根据绘制的ER图我们可以确定,订单-票据的数据表实现需要三张表,订单表Orders(Order是数据库关键字因此不能作为表名),票据表Ticket,中间表Oticket。在我的项目中订单表Orders和票据表Ticket属性较为复杂,在此不一一列举说明,关系表Oticket中用我用oid记录订单id,tid记录票据id。
- 模型定义
对照文档中的belongsToMany方法
来给Orders模型和Ticket模型定义关联
中间表名都是Oticket,大家需要注意一下外键和当前模型关联键名的位置不要写错
模型要和表名一致,建议大家使用自动生成目录的方法,在build.php中定义好所有的控制器、模型、验证器等,注意大小写,在此先不详细介绍了,可参见链接描述。
- 控制器调用查询
在控制器中写一个接口,查询出符合查询条件的结果集,定义为$res,我的需求是列表查询,订单列表中就需要显示每笔订单下票据的详细信息,因此需要将每笔订单中的每张票据信息封装在ticketInfo中。
调用的列表接口结果集返回实例参见接口文档 链接描述
{
"id": 22,
"orderNumber": "2018011857511014",
"cid": 1,
"state": 0,
"message": " ",
"fakeAmount": 20000,
"realAmount": 19800,
"price": 200,
"discount": 0,
"profit": 0,
"isShare": 0,
"payTime": 1516248345,
"deadline": 1516248945,
"sendTime": 0,
"sentTime": 0,
"finishTime": 0,
"cancelTime": 0,
"closeTime": 0,
"create_time": 1516248345,
"isDelete": 0,
"deleteTime": 0,
"company": "杭州柯基有限公司",
"ticketSum": 2,
"ticketInfo": [
{
"tid": 4,
"aid": 8,
"acceptBank": "三农",
"ticketState": 0,
"ticketNumber": "12423412",
"image": "uploads/20180115/a301db72444edd285650bf655d26ac70.jpg",
"fakeAmount": 234234,
"price": 123,
"discounts": 0,
"adjustDay": 0,
"ticketTime": 1514876755,
"endTime": 1517388228,
"restTime": 11
},
{
"tid": 5,
"aid": 8,
"acceptBank": "三农",
"ticketState": 0,
"ticketNumber": "324534234",
"image": "uploads/20180115/b6894f7048b361dc905b414b5fe2d705.jpg",
"fakeAmount": 23412431,
"price": 2314,
"discounts": 0,
"adjustDay": 0,
"ticketTime": 1514882243,
"endTime": 1517388228,
"restTime": 11
}
]
}
以上就是我在项目实践中对多对多关联的一些应用,主要还是对照开发文档实践链接描述,只是文档中只介绍了单个查询的方法,我展示的是在应用中遇到的我使用结果集关联查询的方法,若是单笔订单查询,就不需要用到循环。