我试图通过orgperson()指定一个1:1的关系,尽管现有关系的m:m性质是orgs(),所以我可以急于加载一个默认组织。
我有以下对象,每个对象都有一个表:
我的“jerry-rigging”,如orgperson()函数所示,是否有效?
如果没有,那会有什么接近的吗?
在Person模型中,相关关系如下:
// many-to-many relationship from person to orgs via org-person table
public function orgs()
{
return $this->belongsToMany(Org::class, 'org-person', 'personID', 'orgID');
}
// "pivot table" with additional fields
public function orgperson()
{
return $this->belongsTo(OrgPerson::class, 'personID', 'personID')
->where([
['orgID', $this->defaultOrgID],
['personID', $this->personID]
]);
}
既然你已经定义了你的关系'orgs',那么更好的方法是:
public function orgperson()
{
return $this->orgs()
->where("orgID", '=', $this->defaultOrgID)
->where("personID", '=', $this->personID);
}
事实证明,这就像我希望的那样简单。
我的中间表(组织人员)已被定义为模型。我玩弄了它的类扩展Pivot而不是Model,但最后,我坚持使用Model。
有效的代码(我的Person模型上的关系):
public function orgperson()
{
return $this->hasOne(OrgPerson::class, 'personID', 'personID')
->where('orgID', $this->defaultOrgID);
}
这让我获得了能够让这种关系根据defaultOrgID中的值从数据透视表中的多个记录返回单个条目的预期结果。
我的问题是使用“belongsTo”而不是“hasOne”。