SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'role_not' ОШИБКА - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь отобразить пользователей, отличных от 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

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Основная проблема заключается в том, что у вас была опечатка при использовании вашей области, но из-за того, как вы назвали свою область, это все еще было допустимым предложением where{column}.

Laravel имеет динамические функции c, такие как where{column}($search), которые создают простое предложение where для значений {column} и $search. Возьмите ваш пример:

$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 c where{column} пункты, так что вам следует избегать этого.

0 голосов
/ 28 января 2020

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'));
 } 

Даже если 'где' является зарезервированным ключевым словом, оно все равно будет работать

Просто вы упустили возможность назвать точное название вашей локальной области действия, поэтому Laravel рассматривает его как условие where для вашего построителя запросов.

пожалуйста, прочитайте документы local scope

...