使用一个雄辩的模型访问多个数据透视表

时间:2014-11-05 15:59:15

标签: laravel eloquent

受挫的例子:去!

说我有Dog

Dog可归UserCompany所有,每个is_shotted。 (它是一只可爱的狗)。

所以到目前为止我们正在使用5个表:

  • 公司
  • dog_company
  • dog_user
  • 用户

现在,为了使事情变得复杂,每个数据透视表都有一两个额外的字段。让我们说公司跟踪狗的拍摄记录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}}? (如果需要,我可以修改访问者。)

1 个答案:

答案 0 :(得分:1)

获得$dog对象后,请调用dog_company反向关系,即$dog->companies()->first()->pivot->is_shotted从狗到公司向后工作。或者如果狗可以属于多个公司,$dog->companies将全部检索它们,您需要决定检查哪个公司is_shotted


如果您需要检索is_shottedis_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并将结果合并到一个集合中,但我没有测试过。