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
我试图显示 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