Изучение Laravel Spatie: получение пользователей без учета определенных ролей

Управление доступом на основе ролей является общим требованием во многих веб-приложениях. Laravel, популярный PHP-фреймворк, предлагает мощный пакет Spatie для управления ролями и разрешениями. В этой статье мы рассмотрим различные методы получения пользователей, исключая определенные роли, с помощью Laravel Spatie. Мы предоставим примеры кода для демонстрации каждого метода.

Метод 1: использование метода whereDoesntHave

$users = User::whereDoesntHave('roles', function ($query) {
    $query->where('name', 'admin');
})->get();

Этот метод использует функцию whereDoesntHaveдля исключения пользователей с указанной ролью, в данном случае «администратор».

Метод 2: использование метода doesntHaveсо сводной таблицей

$users = User::doesntHave('roles', 'and', function ($query) {
    $query->where('name', 'admin');
})->get();

Метод doesntHaveтакже можно использовать в сочетании со сводной таблицей для исключения пользователей с определенной ролью.

Метод 3: использование метода whereNotIn

$excludedRoles = Role::whereIn('name', ['admin', 'manager'])->pluck('id');
$users = User::whereNotIn('role_id', $excludedRoles)->get();

Этот метод извлекает пользователей, исключая определенные роли на основе их идентификаторов. Метод whereInиспользуется для получения идентификаторов исключаемых ролей.

Метод 4. Использование метода whereDoesntHaveс настраиваемой связью

public function rolesExcept($roles)
{
    return $this->roles()->whereNotIn('name', $roles);
}
$users = User::whereDoesntHave('rolesExcept', ['admin', 'manager'])->get();

Этот метод предполагает создание настраиваемых отношений в модели пользователя для исключения определенных ролей. Метод whereNotInиспользуется в определении пользовательской связи.

Метод 5. Использование необработанных SQL-запросов

$users = User::whereRaw('id NOT IN (SELECT user_id FROM role_user WHERE role_id = ?)', [1])->get();

В случаях, когда необходимы более сложные запросы, вы можете использовать необработанные SQL-запросы для получения пользователей, исключая определенные роли. В этом примере используется подзапрос для исключения пользователей с определенным идентификатором роли.

В этой статье мы рассмотрели различные методы получения пользователей, исключая определенные роли, с помощью Laravel Spatie. Мы рассмотрели такие методы, как whereDoesntHave, doesntHaveсо сводной таблицей, whereNotIn, пользовательские связи и необработанные SQL-запросы. Эти методы обеспечивают гибкость в управлении доступом на основе ролей в приложениях Laravel, позволяя выбирать пользователей в соответствии с вашими конкретными требованиями.