Plugin de rôle Spatie pour les utilisateurs de Laravel + seed avec des rôles, aucun rôle attribué
P粉637866931
2023-09-05 23:24:56
<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>
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
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'origineJ'ai donc dû passer à la création d'utilisateurs un par un et les enregistrer
Maintenant, Spatie crée les relations que vous méritez.