受挫的例子:去!
说我有Dog
。
此Dog
可归User
和Company
所有,每个is_shotted
。 (它是一只可爱的狗)。
所以到目前为止我们正在使用5个表:
现在,为了使事情变得复杂,每个数据透视表都有一两个额外的字段。让我们说公司跟踪狗的拍摄记录is_fed
,用户跟踪他的喂食$users->dogs()->first()->pivot->is_fed
。
假设我已经在User,Company和Dog上正确设置了关系,我可以这样做:
$companies->dogs()->first()->pivot->is_shotted
访问一个数据透视表和
$dog = $users->dogs->first();
$is_fed = $dog->pivot->is_fed;
$dog->addPivot( $company );
$is_shotted = $dog->pivot->is_shotted;
访问另一个。
但是如何同时访问这两个?我想要一种追溯的方式"激活"一段感情。这样的事情只会更好:
toArray()
如果没有在数据透视表上执行原始数据库查询,有没有办法做到这一点?我真的想要避免这种情况,有时会使事情变得非常混乱。
作为一种安慰选择:是否有一个"权利"将数据添加到模型中的方法,表格上没有的属性,这些属性将在请求中保留并仍然是{{1}}? (如果需要,我可以修改访问者。)
答案 0 :(得分:1)
获得$dog
对象后,请调用dog_company
反向关系,即$dog->companies()->first()->pivot->is_shotted
从狗到公司向后工作。或者如果狗可以属于多个公司,$dog->companies
将全部检索它们,您需要决定检查哪个公司is_shotted
。
如果您需要检索is_shotted
和is_walked
作为一个结果集合的一部分,您可以使用访问器并合并这两个关系。因此,例如,从dog
模型开始,您可以:
public function getOwnersAttribute($value)
{
$ownerUser = $this->users;
$ownerCompany = $this->company;
// Return a single collection result
return $ownerUser->merge($ownerCompany);
}
或者,在关系上添加其他方法:
public function getOwnersAttribute($value)
{
$ownerUser = $this->users()->latest()->get();
$ownerCompany = $this->company()->latest()->get();
// Return a single collection result
return $ownerUser->merge($ownerCompany);
}
我想你可以修改这个访问者来自user
->
dog
->
company
并将结果合并到一个集合中,但我没有测试过。