如何使用 Spatie 在 Laravel 中使用播种机为所有用户添加分配角色?

Sya*_* KK -1 laravel spatie

我正在使用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');
Run Code Online (Sandbox Code Playgroud)

如何使用播种机实现这一目标?或者任何其他选项可用于此?

lag*_*box 7

如果您的用户刚刚由工厂创建并且尚未分配任何角色,您可以遍历它们并分配您想要的角色,或者获取角色并将用户关系与从工厂返回的用户集合同步。

如果你想一一遍历它们:

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

如果您想尝试附加角色的用户:

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

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

$role->users()->attach($users);
Run Code Online (Sandbox Code Playgroud)

如果您在播种前没有清除数据库,那么您将拥有一堆从先前运行播种机中创建的旧用户。您可以将数据库中的所有用户和assignRole每个用户旋转到您想要的角色,或者您可以尝试与所有用户建立角色attachusers关系。

Role::findByName('subscription')->users()->sync(User::pluck('id'));
Run Code Online (Sandbox Code Playgroud)

但是哦不,这个答案中有角色这个词,这意味着它必须从其他人的答案中复制。该assignRole方法也被使用,所以它也必须是一个副本。变量$user也被使用了,所以很明显是一个副本。


Inz*_*ees 1

在你的播种机中试试这个:

创建用户后你可以这样做

// 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]));
Run Code Online (Sandbox Code Playgroud)

基本上你不能在方法中添加字符串,assignRole你可以添加模型的Object字符串Role。如果您已经创建了角色,那么您可以在此处通过名称找到角色,然后可以在方法中传递它assigRole

我希望它对你有帮助。谢谢

  • `assignRole` 接受一个数组、字符串或 Role 对象..所以你可以向它传递一个字符串,自述文件中的第一个示例使用一个字符串 (2认同)