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

Posted

技术标签:

【中文标题】SQLSTATE [42S22]:找不到列:1054 未知列 \'role_not\' 错误【英文标题】:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'role_not' ERRORSQLSTATE [42S22]:找不到列:1054 未知列 'role_not' 错误 【发布时间】:2020-05-14 01:09:43 【问题描述】:

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

【问题讨论】:

【参考方案1】:

核心问题是您在使用范围时有一个拼写错误,但由于您命名范围的方式,它仍然是有效的wherecolumn 子句。

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

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

whereRoleNot 尝试为列创建where 子句,在您的情况下为role_not(从字符串RoleNot 动态构造),而您的数据库表没有此列。

只需使用普通的 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 的动态 wherecolumn 子句冲突,所以你应该避免它。

【讨论】:

不,这不是真的,即使 where 是保留关键字,但它仍然可以工作。他只是错过了调用错误不断显示的本地范围的确切名称。 我不确定哪个优先,但你可以使用wherecolumn,所以你应该避免命名scope,这会与之冲突。 whereRoleNotscopeWhereRoleNotIn 不匹配是对的,但我正在解释为什么他们会收到错误,而不是关于错误范围名称的错误。我还提供了一种正确命名和使用范围的方法,以完全避免这个问题,但显然你仍然觉得有必要对此投反对票? 可能!,因为您没有以他自己的方式解决他的问题,而且您的解决方案甚至与为什么会出现这样的错误相去甚远。如果你真的遇到了他面临的问题,请再次阅读上面的代码。 您需要了解他们为什么会收到错误... Laravel 的动态 where 子句,例如 whereRoleNot(这是范围的错字,是的,但 仍然是有效的 where子句) 导致错误。我的解决方案是 A) 使用普通的 where 子句,或 B),如果使用范围,请以 wherecolunn 不冲突的方式命名。这怎么不是解决方案? 这仍然是一个解决方案,但仍然是为什么错误是这样的问题。即使是我,在第一次阅读您的帖子时,我也很惊讶他使用的范围名称无效,但我已经在这里使用了它。如果有人正在阅读您的帖子,他们也会期望他们不能做坏事而不知道它仍然有效但不是一个好的做法。【参考方案2】:

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

这是因为 Laravel 期望您的 User 表中有一个列 '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'));
  

即使 'where' 是保留关键字,它仍然有效

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

请阅读文档local scope

【讨论】:

为什么投反对票?我在我的本地和它的工作上尝试了上面的代码。

以上是关于SQLSTATE [42S22]:找不到列:1054 未知列 'role_not' 错误的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [42S22]:找不到列:1054 未知列 '0' where 子句

SQLSTATE [42S22]:找不到列:1054 未知列 laravel 5.1

SQLSTATE [42S22]:找不到列:1054 'where 子句'中的未知列'user_id'

Laravel 删除数据 - SQLSTATE [42S22]:找不到列:1054 未知列

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

SQLSTATE [42S22]:找不到列:在 laravel livewire 项目中