我有一个多对多关系设置并使用我的数据库。这是使用具有名为“linked_by”的额外列的数据透视表。这样做的想法是,我可以跟踪在其他两个表之间创建链接的用户。
以下是尝试的视觉表示:
权限 -> 权限角色 -> 角色
权限角色 -> 人员
permissions_roles 表有一个附加列名称“linked_by”,我可以使用 ->pivot 方法来获取该列的值。问题是它只返回精确的列值。我已经为此链接到 person.id 定义了一个外键约束,但我无法找到一种方法来从 Laravel Eloquent 模型中查询它。
如何从 Eloquent 查询中查询链接到“linked_by”列的人员姓名?
理想情况下,我希望查询类似于:
permissions::find(1)->roles->first()->pivot->linked_by->name;
但是,由于我还没有为这个数据透视表列定义雄辩的关系,所以我无法做到这一点,但我无法弄清楚如果可能的话我将如何做到这一点?
这是做到这一点的唯一方法:
$linkee = permissions::find(1)->roles->first()->pivot->linked_by;
$person = person::find($linkee);
$person->name;
->using();
我发现 Laravel 有一种方法可以通过为数据透视表创建模型来实现我想要的开箱即用的功能。
这是通过将
->using()
添加到 return $this->belongsToMany()
模型函数来实现的。
通过将新创建的枢轴模型的名称放入
->using()
方法中,我们可以像任何其他雄辩调用一样调用此枢轴模型中的任何函数。
因此,假设我的权限属于许多角色,并且数据透视表有一个名为“linked_by”的第三列(这是 Users 表中用户的外键):
我的权限模型将具有:
public function roles()
{
return $this->belongsToMany('App\roles','permissions_roles','permissions_id','roles_id')
->using('App\link')
->withPivot('linked_by');
}
新的链接模型将包含:
注意扩展枢轴而不是模型
use Illuminate\Database\Eloquent\Relations\Pivot;
class link extends Pivot
{
//
protected $table = 'permissions_roles';
public function linkedBy()
{
return $this->belongsTo('App\users', 'linked_by');
}
}
显然,您需要在角色模型中定义
belongsToMany
关系的另一侧,但完成此操作后,我可以使用以下命令来提取链接到 linked_by 列中第一个角色的人员姓名:
permissions::find(1)->roles->first()->pivot->linked_by->name;
您应该能够通过权限模型中的
toArray
方法来实现这一点。
/**
* Convert the model instance to an array.
*
* @return array
*/
public function toArray(): array
{
$attributes = $this->attributesToArray();
$attributes = array_merge($attributes, $this->relationsToArray());
// Detect if there is a pivot value and return that as the default value
if (isset($attributes['pivot']['linked_by']) && is_int($attributes['pivot']['linked_by'])) {
$linkeeId = $attributes['pivot']['linked_by'];
$attributes['pivot']['linkee'] = Person::find($linkeeId)->toArray();
//unset($attributes['pivot']['linked_by']);
}
return $attributes;
}