Plugin de rôle Spatie pour les utilisateurs de Laravel + seed avec des rôles, aucun rôle attribué
P粉637866931
P粉637866931 2023-09-05 23:24:56
0
1
600
<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粉637866931
P粉637866931

répondre à tous(1)
P粉216807924

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal