Spatie 角色插件,用于 Laravel + 具有角色的种子用户,不分配角色
P粉637866931
P粉637866931 2023-09-05 23:24:56
0
1
609
<p>在 Laravel 9 我尝试为用户添加角色</p> <p>Spatie 刚刚处理了所有事情,没有错误,但在数据库中,角色和用户之间的关系没有出现在表“model_has_role”的模型中</p> <p><code>我创建了类似的角色</code></p> <pre class="brush:php;toolbar:false;">$roleName = 'MyRole'; $guardName = 'myGuard'; $roleObj = Role::create(['guard_name' => $guardName, 'name' => $roleName]);</pre> <p><code>然后创建用户,例如</code></p> <pre class="brush:php;toolbar:false;">$user = new User($userDatas);</pre> <p><code>我从模型中收集了应填写的所有数据</code></p> <pre class="brush:php;toolbar:false;">$arrayWithUsersData = []; foreach($users as $user) { if($users !== NULL) { $arrayWithUsersData[] = $user->getAttributes(); } }</pre> <p><code>在此之后,我尝试将所有用户一次插入数据库,所以我使用了</code></p> <pre class="brush:php;toolbar:false;">DB::table('users')->insert($arrayWithUsersData);</pre> <p>最后我在 foreach $users 中尝试了任何可能的方式来分配角色 像:</p> <pre class="brush:php;toolbar:false;">$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]);</pre> <p>但是没有给出任何错误,但仍然没有创建关系</p>
P粉637866931
P粉637866931

全部回复(1)
P粉216807924

问题是,如果模型存在,则 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”,因为它适用于原始数据

所以我必须切换为一一创建用户并保存它们

$user = new User($userData);
$user->save();

现在 Spatie 创建应有的关系。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板