如何在 Laravel 5.5 中使这种多对多关系起作用?

How can I get this many-to-many relationship work in Laravel 5.5?

我在 eloquent Laravel 5.5

中遇到多对多关系错误

Illuminate \ Database \ QueryException (42000) SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'users' (SQL: select users.*, users.roles_id as pivot_roles_id, users.users_id as pivot_users_id, users.id as pivot_id, users.created as pivot_created, users.updated as pivot_updated, users.deleted as pivot_deleted from users inner join users on users.id = users.users_id where users.roles_id = 2)

我有一个用户 table、角色 table 和一个 user_role table(枢轴 table)。 user_role table 有以下列:id, users_id(fk from users table),roles_id (fk from roles table),创建、更新、删除。

在我的用户模型中

public function roles(){
    return $this->belongsToMany(\App\roles::class,'roles','users_id','roles_id','id','id')->withPivot(['id','created','updated','deleted']);
}

在我的角色模型中

public function users(){
    return $this->belongsToMany(\App\User::class,'users','roles_id','users_id','id','id')->withPivot(['id','created','updated','deleted']);
}

在我的控制器中我有

$roles = $this->rolesObject->whereNull('deleted')->orderBy('role')->get();
//Just for testing how to view the relationship won't be real code in the end
foreach($roles as $role){
    foreach($role->users as $user){
        dump($user->display_name);
    }
}

查看文档,看起来我正在正确设置关系,但显然我没有,我也不知道我做错了什么

belongsToMany 方法的第二个参数是关系 table name(docs),你必须传递 role_user 而不是 users

public function roles(){
    return $this->belongsToMany(\App\roles::class,'role_user','users_id','roles_id','id','id')->withPivot(['id','created','updated','deleted']);
}

...
public function users(){
    return $this->belongsToMany(\App\User::class,'role_user','roles_id','users_id','id','id')->withPivot(['id','created','updated','deleted']);
}

您的代码认为您的第二个参数 users 是一个关系 table 名称,这就是错误的原因。