在 Laravel 9 我尝试为用户添加角色
Spatie 刚刚处理了所有事情,没有错误,但在数据库中,角色和用户之间的关系没有出现在表“model_has_role”的模型中
我创建了类似的角色
$roleName = 'MyRole'; $guardName = 'myGuard'; $roleObj = Role::create(['guard_name' => $guardName, 'name' => $roleName]);
然后创建用户,例如
$user = new User($userDatas);
我从模型中收集了应填写的所有数据
$arrayWithUsersData = [];
foreach($users as $user)
{
if($users !== NULL)
{
$arrayWithUsersData[] = $user->getAttributes();
}
}
在此之后,我尝试将所有用户一次插入数据库,所以我使用了
DB::table('users')->insert($arrayWithUsersData);
最后我在 foreach $users 中尝试了任何可能的方式来分配角色 像:
$user->assignRole($roleName); $user->assignRole($roleName, $guardName); $user->assignRole([$roleName, $guardName]); $user->assignRole($myRole); $user->assignRole($myRole, $guardName); $user->assignRole([$myRole, $guardName]); $user->syncRoles($myRole); $user->syncRoles($myRole, $guardName); $user->syncRoles([$myRole, $guardName]);
但是没有给出任何错误,但仍然没有创建关系
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
问题是,如果模型存在,则 allocateRole 和syncRole 中的 spatie 有效
我的意思是 Laravel 模型具有“存在”属性
vendor\spatie\laravel-permission\src\Traits\HasRoles.php 中有一些来自 allocateRole 函数的代码
syncRoles 是 allocateRole 的包装器
$model = $this->getModel(); if ($model->exists) { $this->roles()->sync($roles, false); $model->load('roles'); } else { $class = \get_class($model); $class::saved( function ($object) use ($roles, $model) { if ($model->getKey() != $object->getKey()) { return; } $model->roles()->sync($roles, false); $model->load('roles'); } ); }因此
DB::table('users')->insert($arrayWithUsersData);不要更改模型中的参数“exists”,因为它适用于原始数据所以我必须切换为一一创建用户并保存它们
现在 Spatie 创建应有的关系。