Laravel - Ensemencement Des Relations
Dans Laravel, base de données de semis est généralement accompli par le Modèle des usines. Si vous définissez un plan détaillé pour votre Modèle à l'aide de Faussaire de données, et de dire comment beaucoup de cas, vous devez:
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
$user = factory(App\User::class, 50)->create();
Cependant, disons que votre modèle Utilisateur dispose d'un hasMany
relation avec de nombreux autres Modèles, comme un Post
modèle par exemple:
Post:
id
name
body
user_id
Donc, dans cette situation, vous voulez des graines de votre table Posts avec réelle les utilisateurs qui ont été ensemencées dans votre table des Utilisateurs. Cela ne semble pas être discutées, mais j'ai trouvé le suivant dans la Laravel docs:
$users = factory(App\User::class, 3)
->create()
->each(function($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
Donc dans votre usine, vous créez X nombre de Postes pour chaque Utilisateur que vous créez. Cependant, dans une grande demande d'où peut-être 50 - 75 Modèles partagent des relations avec le Modèle de l'Utilisateur, l'Utilisateur de votre Semoir essentiellement en fin de semis de l'ensemble de la base de données avec toutes ses relations.
Ma question est: Est-ce la meilleure façon de gérer cela? La seule autre chose que je peux penser à est de la Graine les Utilisateurs au premier (sans semis de toutes les relations), puis tirez-le hasard des Utilisateurs à partir de la DB est nécessaire, pendant que vous êtes à l'ensemencement autres Modèles. Toutefois, dans les cas où ils ont besoin d'être unique, vous devez suivre les Utilisateurs qui avaient été utilisés. Aussi, il semble que ce serait d'ajouter beaucoup de requête supplémentaire-en vrac pour le semis processus.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser saveMany ainsi. Par exemple:
saveMany()
jusqu'à ce que j'ai vu cette réponse. Je vous remercie. 🙂Vous pouvez le faire à l'aide de fermetures à l'intérieur de la ModelFactory comme discuté ici.
Cette solution fonctionne proprement et élégamment avec des semoirs ainsi.
Pour votre semoir à utiliser quelque chose de simple comme ceci:
REMARQUE: Cette méthode ne permet pas de créer les entrées inutiles dans la base de données, plutôt que le passé attributs sont attribués AVANT la création d'enregistrements associés.
Personnellement, je pense que l'un Semoir classe pour gérer ces relations est mieux, puis séparés semoir classes, parce que vous avez tous la logique dans un seul endroit, donc en un seul coup d'oeil, vous pouvez voir ce qui se passe. (Toute personne qui sait une meilleure approche: s'il vous plaît partager) 🙂
Une solution pourrait être: un DatabaseSeeder et méthodes privées au sein de la classe afin de garder la méthode un peu plus propre. J'ai cet exemple ci-dessous, qui a un Utilisateur, un Lien, LinkUser (plusieurs-à-plusieurs) et d'une Note (plusieurs-à-un).
Pour le plusieurs-à-plusieurs relations j'ai d'abord créer tous les Liens, et d'obtenir l'id inséré. (depuis les identifiants sont auto-inc je pense que les identifiants peuvent être récupérés plus facile (obtenir un max), mais n'a pas d'importance dans cet exemple). Puis créer les utilisateurs, et attache de l'aléatoire des liens vers chaque utilisateur (plusieurs-à-plusieurs). Il crée également des notes aléatoires pour chaque utilisateur (plusieurs-à-un exemple). Il utilise la "fabrique" des méthodes.
Si vous remplacez le "Lien" pour votre "Post" cela devrait fonctionner. (Vous pouvez supprimer la "Note" de la section, alors...)
(Il y a aussi une méthode pour vous assurer que vous avez 1 utilisateur valide avec vos propres informations d'identification de connexion.)
Alors maintenant, si vous faites cela
factory(App\Post::class, 4)->create()
il va créer 4 différents postes et dans le processus de création de 4 utilisateurs différents.Si vous voulez le même utilisateur pour tous les postes que j'ai l'habitude de le faire est:
Je veux partager l'approche que j'ai pris pour insérer le nombre de postes à de nombreux utilisateurs:`
`
Cette solution a fonctionné pour moi, après avoir été toute la journée à la recherche d'un moyen de graines de la relation