TP6的远程一对一模型关联其实就是一张表通过中间一张表,关联到第三张表,这在我们实际的项目开发中还是比较常见的,网上关于TP6对这方面的资料也很少,所以写一下自己的实际运用方法。
由于TP6的手册对远程一对一模型关联(跨表关联)的介绍比较简单,并且官方文档介绍的使用方法对数据库设计是有要求的。
按官方文档介绍的写法是:
那么官方的数据库设计其实是这样的:关联键都是设计在被关联表,比如User表关联Profile表,那么他会有个user_id设计在Profile表,profile_id设计在Card表,这种情况下,按照官方文档的写法是可以运行的。
但是项目的数据库一旦设计完是很难更改的,我现在碰到的情况是:
我有一张outStorage表,关联Order表,order_id设计在了outStorage表:
然后,order表又关联customer表,customer_id设计在了order表:
customer表:
由于项目要求,平常用id作主键现在全部用nid作为主键了。
那么我用outStorage表通过order_id关联到order表,再用order表的customer_id关联到customer表,进而查到数据就应该这样写了:
public function customer(){
return $this->hasOneThrough(Customer::class,Order::class,"nid","nid","order_id","customer_id");
}
参数是:被关联表模型,中间表模型,中间表id,被关联表id,中间表关联字段,被关联表关联字段。
注意:如果在控制器里面用with查询的时候,闭包方法里面的语句如果不是很清楚原理就不要乱写,否则很容易报错:
以上。