如何返回table1中的行不存在于la2中的table2中

时间:2017-01-08 09:39:07

标签: php mysql laravel relational-database

我尝试在laravel中使用连接表

role_user表包含roles_id和user_id列 roles表具有id和角色的名称 users表具有用户的id和名称

 $roles = Role::leftJoin('role_user', 'roles.id', '!=' , 'role_user.role_id')
        ->select('roles.*', 'role_user.user_id', 'role_user.role_id')
        ->where('role_user.user_id','=',$name)
        ->get();

但似乎'!='无法正常工作我尝试使用'='并且工作正常 当我尝试使用'='时,没有结果

我也试过

public function roles()
{
return $this->belongsToMany('App\Role');
}

@foreach($user->roles as $role)
    {{ roles->name}}
@endForeach

但它显示了user_role和角色表的匹配ID,我想反过来想要显示角色表的行与user_role的表不匹配

2 个答案:

答案 0 :(得分:1)

  

我想显示与user_role表不匹配的角色表行

使用whereDoesntHave()方法:

 $roles = Role::whereDoesntHave('users', function($q) use($name) {
     $q->where('name', $name);
 })->get();

在视图中:

@foreach ($roles as $role)
    {{ role->name }}
@endforeach

不要忘记定义users()关系:

public function users()
{
    return $this->belongsToMany('App\User');
}

答案 1 :(得分:0)

在您的用户模型中创建功能角色

Role::whereNotIn('id',function($query){
            $query->select('role_id')->from('role_user');
        })->get();