Maison  >  Questions et réponses  >  le corps du texte

Plugin de rôle Spatie pour les utilisateurs de Laravel + seed avec des rôles, aucun rôle attribué

<p>Dans Laravel 9 J'ai essayé d'ajouter un rôle à l'utilisateur</p> <p>Spatie vient de tout traiter sans erreur, mais dans la base de données, la relation entre le rôle et l'utilisateur n'apparaît pas dans le modèle de la table "model_has_role"</p> <p><code>J'ai créé un caractère similaire</code></p> <pre class="brush:php;toolbar:false;">$roleName = 'MonRôle'; $guardName = 'myGuard'; $roleObj = Role::create(['guard_name' => $guardName, 'name' => $roleName]);</pre> <p><code> Créez ensuite un utilisateur, par exemple </code></p> <pre class="brush:php;toolbar:false;">$user = new User($userDatas);</pre> <p><code>J'ai collecté toutes les données du modèle qui doivent être renseignées</code></p> <pre class="brush:php;toolbar:false;">$arrayWithUsersData = []; foreach ($ utilisateurs en tant que $ utilisateur) { si($utilisateurs !== NULL) { $arrayWithUsersData[] = $user->getAttributes(); } }</pré> <p><code>Après cela, j'ai essayé d'insérer tous les utilisateurs dans la base de données en même temps, j'ai donc utilisé </code></p> <pre class="brush:php;toolbar:false;">DB::table('users')->insert($arrayWithUsersData);</pre> <p>Enfin, j'ai essayé tous les moyens possibles pour attribuer des rôles dans foreach $users Comme : </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>Mais aucune erreur n'est donnée, mais aucune relation n'est toujours créée</p>
P粉637866931P粉637866931432 Il y a quelques jours599

répondre à tous(1)je répondrai

  • P粉216807924

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

    Le problème est que le spatie dans allocateRole et syncRole fonctionne si le modèle existe

    Je veux dire que les modèles Laravel ont la propriété "existe"

    vendorspatielaravel-permissionsrcTraitsHasRoles.php contient du code de la fonction allocateRole

    • syncRoles est un wrapper pour 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');
                }
            );
        }

    Par conséquent DB::table('users')->insert($arrayWithUsersData); ne modifiez pas le paramètre "existe" dans le modèle car il s'applique aux données d'origine

    J'ai donc dû passer à la création d'utilisateurs un par un et les enregistrer

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

    Maintenant, Spatie crée les relations que vous méritez.

    répondre
    0
  • Annulerrépondre