suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Spatie-Rollen-Plugin für Laravel + Seed-Benutzer mit Rollen, keine zugewiesenen Rollen

<p>In Laravel 9 Ich habe versucht, dem Benutzer</p> eine Rolle hinzuzufügen. <p>Spatie hat gerade alles fehlerfrei verarbeitet, aber in der Datenbank erscheint die Beziehung zwischen Rolle und Benutzer nicht im Modell für die Tabelle „model_has_role“</p> <p><code>Ich habe einen ähnlichen Charakter erstellt</code></p> <pre class="brush:php;toolbar:false;">$roleName = 'MyRole'; $guardName = 'myGuard'; $roleObj = Role::create(['guard_name' => $guardName, 'name' => $roleName]);</pre> <p><code>Dann erstellen Sie einen Benutzer, zum Beispiel </code></p> <pre class="brush:php;toolbar:false;">$user = new User($userDatas);</pre> <p><code>Ich habe alle Daten gesammelt, die aus dem Modell ausgefüllt werden sollten</code></p> <pre class="brush:php;toolbar:false;">$arrayWithUsersData = []; foreach($users als $user) { if($users !== NULL) { $arrayWithUsersData[] = $user->getAttributes(); } }</pre> <p><code>Danach habe ich versucht, alle Benutzer auf einmal in die Datenbank einzufügen, also habe ich </code></p> <pre class="brush:php;toolbar:false;">DB::table('users')->insert($arrayWithUsersData);</pre> <p>Schließlich habe ich jede mögliche Möglichkeit ausprobiert, Rollen in foreach $users zuzuweisen Gefällt mir: </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>Aber es wird kein Fehler ausgegeben, aber es wird trotzdem keine Beziehung erstellt</p>
P粉637866931P粉637866931504 Tage vor648

Antworte allen(1)Ich werde antworten

  • 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 创建应有的关系。

    Antwort
    0
  • StornierenAntwort