Laravel - 如何查询数据透视表上的关系

Pet*_*y87 5 pivot laravel eloquent

我的设置

我有一个多对多关系设置并使用我的数据库。这是使用具有名为“linked_by”的额外列的数据透视表。这样做的想法是,我可以跟踪在其他两个表之间创建链接的用户。

下面是尝试的视觉表示:

权限 -> 权限角色 -> 角色

权限角色 -> 人员

视觉表现

问题

Permissions_roles 表有一个附加列名称“linked_by”,我可以使用 ->pivot 方法来获取该列的值。问题是它只返回精确的列值。我已经为此链接到 person.id 定义了一个外键约束,但我无法找到一种方法来从 Laravel Eloquent 模型中查询它。

问题

如何从 Eloquent 查询中查询链接到“linked_by”列的人员姓名?

理想情况下,我希望查询类似于:

permissions::find(1)->roles->first()->pivot->linked_by->name;
Run Code Online (Sandbox Code Playgroud)

但是,由于我还没有为这个数据透视表列定义雄辩的关系,所以我无法做到这一点,但我无法弄清楚如果可能的话我将如何做到这一点?

执行此操作的唯一方法是:

$linkee = permissions::find(1)->roles->first()->pivot->linked_by;
$person = person::find($linkee);
$person->name;
Run Code Online (Sandbox Code Playgroud)

Pet*_*y87 9

->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');
    }
Run Code Online (Sandbox Code Playgroud)

新的链接模型将包含:

注意扩展枢轴而不是模型

use Illuminate\Database\Eloquent\Relations\Pivot;

class link extends Pivot
{
    //
    protected $table = 'permissions_roles';

    public function linkedBy()
    {
        return $this->belongsTo('App\users', 'linked_by');
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,您需要belongsToMany在角色模型中定义关系的另一侧,但完成此操作后,我可以使用以下命令来提取链接到 linked_by 列中第一个角色的人员姓名:

permissions::find(1)->roles->first()->pivot->linked_by->name;
Run Code Online (Sandbox Code Playgroud)