Я использую разрешение ролей Spatie для обработки пользовательских ролей в приложении laravel. Я создал пользователей, используя фабрику factory(App\User::class, 50)->create();, и теперь некоторые из них являются администраторами. Я хочу заменить всю роль на подписчика, и только один пользователь является администратором.

Я создал сеялку для создания пользователя-администратора и добавил роль для этого

$user = User::create([
    'name_first' => 'Admin',
    'email' => 'admins@admins.com',
    'password' => bcrypt('admins@admins.com')
]);

$user->assignRole('super-admin');

Как можно добиться этого с помощью сеялки? Или любой другой вариант доступен для этого?

-1
Syam kumar KK 6 Дек 2019 в 09:36
Назначается ли кому-либо из этих пользователей роль после вызова фабричного метода create? как бы трудно сказать с твоей формулировкой
 – 
lagbox
6 Дек 2019 в 09:54
Вовсе нет, это по умолчанию с ролью администратора .. Смущает !!! ...
 – 
Syam kumar KK
6 Дек 2019 в 11:07
Что "идет по умолчанию с ролью администратора", нет значений по умолчанию, это все, что вы создали и делаете сами
 – 
lagbox
6 Дек 2019 в 11:14
Смешно .. Тогда откуда идет ...
 – 
Syam kumar KK
6 Дек 2019 в 11:47
Какую версию laravel вы используете, какую версию этого пакета вы используете? потому что нет версии этого пакета, которая создает для вас какие-либо разрешения или роли ... это то, что вы добавили сами ... при условии, что это пакет spatie / laravel-permission
 – 
lagbox
6 Дек 2019 в 11:54

2 ответа

Если ваши пользователи только что были созданы на фабрике и им не назначена какая-либо роль, вы можете пройти через них итерацию и назначить нужную вам роль, либо получить роль и синхронизировать отношения пользователей с коллекцией пользователей, которые возвращаются с фабрики.

Если вы хотите перебрать их по очереди:

factory(App\User::class, 50)->create()->each(function ($user) {
    $user->assignRole('subscription'); // assuming 'supscription' was a typo
});

Если вы хотите попробовать присоединить пользователей к роли:

$users = factory(App\User::class, 50)->create();

$role = Role::findByName('subscription');

$role->users()->attach($users);

Если вы не очищаете свою базу данных перед заполнением, то у вас будет куча старых пользователей, которых вы создали из предыдущего запуска сеялки. Вы можете прокрутить всех пользователей в базе данных и assignRole каждого из них на нужную вам роль, или вы можете попробовать attach в отношении users для роли со всеми пользователями.

Role::findByName('subscription')->users()->sync(User::pluck('id'));

Но нет, слово «Роль» в этом ответе означает, что оно должно быть скопировано из чужого ответа. Метод assignRole также используется, поэтому он также должен быть копией. Переменная $user также используется, поэтому, очевидно, копия.

8
lagbox 6 Дек 2019 в 10:58
Попробуй использовать мой метод
 – 
Inzamam Idrees
6 Дек 2019 в 10:31
Вы очищаете свою базу данных перед запуском этих сидеров? это только добавляет роль новым пользователям, созданным на заводе, каждый раз, когда это запускается, это не проходит через вашу базу данных и не обновляет старых пользователей
 – 
lagbox
6 Дек 2019 в 10:38
Это то, что вы ищете, вы хотите обновить уже существующих пользователей в базе данных, а не тех, которые создаются фабрикой?
 – 
lagbox
6 Дек 2019 в 10:54
Я пробовал как после очистки пользователей, так и с новыми пользователями и с существующими пользователями. Но как фейкер создает для пользователей роль по умолчанию. Очистка кеша с помощью php artisan cache: забудьте spatie.permission.cache
 – 
Syam kumar KK
6 Дек 2019 в 11:02
Вы контролируете используемую фабрику и то, что она делает
 – 
lagbox
6 Дек 2019 в 11:05

Попробуйте это в вашей сеялке:

После создания пользователя вы можете сделать

// Create roles
$super_admin = Role::create(['name' => 'Super Admin']);
$admin = Role::create(['name' => 'Admin']);

// Assign role to user
$user->assignRole($super_admin);
// If you have to use Faker then you can also do this
$user->assignRole($faker->randomElement([$super_admin, $admin]));

По сути, вы не можете добавить строку в метод assignRole, вы можете добавить Object модели Role. Если вы уже создали роли, то здесь вы можете найти роль по ее имени, а затем передать ее в метод assigRole.

Я надеюсь, что это будет полезно для вас. Благодарность

-2
Inzamam Idrees 6 Дек 2019 в 09:54
assignRole принимает массив, строку или объект роли .. поэтому вы можете передать ему строку, первый пример в файле readme использует строку
 – 
lagbox
6 Дек 2019 в 09:59