SQLSTATE[42S22]: 未找到列:1054 未知列 'role_not' 错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'role_not' ERROR

我试图显示 super_admin 以外的用户,所以我在我的控制器中使用了 whereRoleNot 函数来隐藏 super_admin 。 我的用户模型:

public function scopeWhereRole($query, $role_name){
    return $query->whereHas('roles', function($q) use($role_name){
        return $q->whereIn('name', (array)'$role_name');
    });
}  //end of scopeWhereRole


public function scopeWhereRoleNotIn($query, $role_name){
    return $query->whereHas('roles', function($q) use($role_name){
        return $q->whereNotIn('name', (array)'$role_name');
    });
}  //scopeWhereRoleNotIn end

和用户控制器索引方法:

public function index()
 {
     //

     $users= User::whereRoleNot('super_admin')->paginate(3);
     return view('dashboard.users.index', compact('users'));
 }  //end of index

核心问题是您在使用范围时有错别字,但由于您命名范围的方式,它仍然是一个有效的 where{column} 子句。

Laravel 具有动态函数,例如 where{column}($search){column} 值和提供的 $search 值构造一个简单的 where 子句。举个例子:

$users = User::whereRoleNot('super-admin');

whereRoleNot 尝试为该列创建一个 where 子句,在您的情况下,role_not(从字符串 RoleNot 动态构建),以及您的数据库 table没有这一栏。

只需使用普通的 where 子句:

$users = User::where('role', '!=', 'super_admin')->paginate(3);

编辑:如果你想使用范围,我建议你稍微更改一下名称:

public function scopeRoleIn($query, $role_name){
  return $query->whereHas('roles', function($q) use($role_name){
    return $q->whereIn('name', (array)$role_name); // Don't use `'` here
  });
} 

public function scopeRoleNotIn($query, $role_name){ 
  return $query->whereHas('roles', function($q) use($role_name){
    return $q->whereNotIn('name', (array)$role_name); // Don't use `'` here
  });
}

然后,按如下方式使用您的范围:

// $users = User::roleIn('super-admin')->paginate(3); // Etc...
$users = User::roleNotIn('super-admin')->paginate(3);

您可以使用 scopeWhere...,但该命名可能与 Laravel 的动态 where{column} 子句冲突,因此您应该避免使用它。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'role_not' ERROR

这是因为 Laravel 认为您的用户 table 中有一个列 'role_not' 考虑到您的本地作用域被命名为 scopeWhereRoleNotIn,删除前缀作用域并它的最终名称将变为 WhereRoleNotIn,但您将作用域名称称为 WhereRoleNot。现在您知道为什么列 'role_not' 是错误的,因为 Laravel 预计您尚未使用本地范围。

现在,要调用此本地范围,您的查询应如下所示

public function index()
{
     $users= User::whereRoleNotIn('super_admin')->paginate(3);
     return view('dashboard.users.index', compact('users'));
 } 

Even if 'where' is a reserved keyword it will still works

这只是您错过了调用本地范围的确切名称的问题,这就是为什么 Laravel 将其视为查询构建器的 where 子句的原因。

请阅读文档local scope