Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表

Posted

技术标签:

【中文标题】Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表【英文标题】:Laravel Eloquent: Bind Table to another table via pivot with multiple relationships 【发布时间】:2018-04-09 10:51:03 【问题描述】:

首先让我为这个模糊的标题道歉,我找不到合适的方法来表述它。

至于问题,在这种情况下,我想将用户绑定到具有特定角色的项目。我正在尝试通过以下数据透视表执行此操作:

|user_has_projects|
|-----------------|
|id               |
|user_id          |
|projectrole_id   |
|project_id       |
|created_at       |
|updated_at       |
|deleted_at       |
|-----------------|

usersprojectsprojectroles 表是您对上述表的期望。

目前每个模型的 Eloquent 关系如下:

Project.php:

public function users()
 
   return $this->belongsToMany(
      "App\User",
      "user_has_projects"
   )->withPivot(
      "user_id"
   )->withTimestamps();


public function userProjects()

    return $this->hasMany(
        "App\UserProjects",
        "project_id",
        "id"
    );

Users.php:

public function projects()
 
   return $this->belongsToMany(
      'App\Project',
      'user_has_projects'
   )->withPivot(
      'project_id'
   );


public function projectRole($id)

    return $this->belongsToMany(
        "App\ProjectRole",
        "user_has_projects"
    )->withPivot(
        "projectrole_id"
    )->wherePivot(
        "project_id",
        '=',
        $id
    );

ProjectRole.php:

public function user()

    return $this->belongsToMany(
        "App\User",
        "user_has_projects"
    )->withPivot(
        "user_id"
    )->withTimestamps();


public function projects()

    return $this->belongsToMany(
        "App\Project",
        "user_has_projects"
    )->withPivot(
        "project_id"
    )->withTimestamps();

UserProjects.php:

public function projectRoles()

    return $this->belongsTo(
        'App\ProjectRoles'
    );


public function users()

    return $this->belongsTo(
        'App\User'
    );


public function projects()

    return $this->belongsTo(
        'App\Project'
    );

现在,如果我想检索绑定到项目的所有用户以及他们在项目中的角色,我会首先调用 $aBoundUsers = $oProject->users(); 然后遍历这些用户以获取他们的角色

foreach($aBoundUsers as $oUser) 
$role = $oUser->projectRole($oProject->id); 

但是,当我调用 $oUser->projectRole(...) 时,我收到以下错误: “在布尔值上调用成员函数 projectRole()”.. 经过一番彻底的搜索,我发现唯一返回的是 "withTimestamps":true

我在这里做错了什么?我找到了一些关于拥有多个模型的数据透视表的解决方案,但没有一个能以某种方式工作。

【问题讨论】:

【参考方案1】:

$oProject->users() 只返回关系,$oProject->users 返回结果。

更改UserProjects 模型的父类:

class UserProjects extends \Illuminate\Database\Eloquent\Relations\Pivot

然后调整你的Project 模型:

public function users()

    return $this->belongsToMany(
        "App\User",
        "user_has_projects"
    )->withPivot(
        "user_id", "projectrole_id"
    )->using("App\UserProjects")
    ->withTimestamps();

然后你可以像这样访问你的角色:

foreach($oProject->users as $oUser) 
    $role = $oUser->pivot->projectRoles; 

【讨论】:

做到了!我现在得到了我需要的确切数据,谢谢!

以上是关于Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表的主要内容,如果未能解决你的问题,请参考以下文章

多个 Laravel Eloquent 关系未显示来自所有关系的数据

Laravel 混合获取 Eloquent 急切加载嵌套多个模型

通过 eloquent 具有子项和权限的 Laravel 菜单

Laravel Eloquent 关系方法语法

通过findMany选择列并在Laravel的Eloquent中保持关系

在 Laravel 中通过多对多关系模型对 eloquent 模型进行排序