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

时间:2019-05-21 15:34:04

标签: laravel eloquent pivot

我的设置

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

下面是尝试的视觉表示:

  

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

     

permissions_roles->人员

Visual_Representation

问题

Permissions_roles表具有一个附加列名称“ linked_by”,我可以使用-> pivot方法获取此列的值。问题在于它仅返回确切的列值。我已经为链接到person.id的外键定义了约束,但是我无法设法从laravel 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;

2 个答案:

答案 0 :(得分:0)

您应该能够在权限模型的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;
}

答案 1 :(得分:0)

->using();

我发现Laravel有一种方法可以通过为数据透视表创建模型来实现我想要的功能。

这可以通过在->using()模型函数中添加return $this->belongsToMany()来实现。

通过将新创建的数据透视模型的名称放入->using()方法中,我们可以像其他任何雄辩的调用一样在此数据透视模型中调用任何函数。

因此,假设我的权限属于许多角色,并且数据透视表具有名为“ linked_by”的第三列(这是用户表中用户的外键):

我的权限模型将具有:

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;