搜尋

首頁  >  問答  >  主體

Spatie 角色插件,用於 Laravel + 具有角色的種子用戶,不分配角色

<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粉637866931P粉637866931447 天前614

全部回覆(1)我來回復

  • P粉216807924

    P粉2168079242023-09-06 19:18:57

    問題是,如果模型存在,則 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 要創造應有的關係。

    回覆
    0
  • 取消回覆