官方文档的说明:
远程一对一关联用于定义有跨表的一对一关系,例如:
- 每个用户有一个档案
- 每个档案有一个档案卡
- 用户和档案卡之间并无关联
举例如下:
1、用户表user包含主键id,对应模型User
2、档案表profile包含user_id外键和id主键,该表关联user,对应模型Profile
3、档案卡表card,包含profile_id外键和id主键,该表用外键关联profile,对应模型Card
如果在用户模型关联档案卡,hasOneThrough('关联模型', '中间模型', '外键', '中间表关联键','当前模型主键','中间模型主键');
User模型创建如下关联定义:
public function card()
{
return $this->hasOneThrough(Card::class,Profile::class,'user_id','profile_id','id','id');
}
我们可以把这当做正向的远程关联;假如反过来,我们想在档案卡模型card中关联user模型怎么写呢?官方没有这样的说明,但是经过实际测试用这个方法也可以实现反向远程一对一关联,只要调整参数顺序就行。
hasOneThrough('关联模型','中间模型','中间主键','关联主键','当前模型中对应中间表的外键','中间模型中对应关联表的外键 ')
在card模型这样定义关联:
public function user()
{
return $this->hasOneThrough(User::class,Profile::class,'id','id','profile_id','user_id');
}
还要注意控制器中查询不能用withJoin应该用with查询。