web-dev-qa-db-fra.com

Comment passer des arguments aux usines Laravel?

J'ai une table users et une relation un à zéro/un avec une table businesses (users.user_id => businesss.user_id). Sur ma table users, j'ai un discriminateur qui me dit si l'utilisateur est de type business et j'ai donc besoin d'avoir des détails sur la table businesses également.

Je veux créer mes utilisateurs avec mon usine qui fonctionne actuellement, puis créer uniquement des détails commerciaux où le discriminateur pointe vers un compte professionnel.

J'ai trois options en tête:

  1. Créez à partir de la fabrique d'utilisateurs, puis utilisez '-> each ()' pour vérifier le discriminateur et créer un nouvel utilisateur professionnel à l'aide de la fabrique. Cependant, je ne peux pas passer à l'usine commerciale le user_id que l'utilisateur a été affecté.
  2. Créez d'abord les utilisateurs. Ensuite, dans mon semoir d'entreprise, récupérez tous les utilisateurs qui correspondent à un discriminateur "entreprise". Ensuite, pour tous ces utilisateurs, exécutez une usine qui crée les détails de l'entreprise. Mais encore une fois, je devrais lier en quelque sorte le user_id de l'utilisateur déjà créé avec la fabrique commerciale user_id.
  3. Dans ma fabrique d'entreprise, créez un nouvel utilisateur et récupérez l'identifiant, créant ainsi le lien entre users.user_id et business.user_id. Cependant, j'utilise un générateur aléatoire pour user.user_type donc même si j'ai la table businesses remplie, cela pourrait être pour les utilisateurs qui ont le discriminateur comme 'personnel'.

Y a-t-il un autre moyen? Puis-je transmettre des arguments de mon semoir à l'usine?

23
Cristian

Les attributs que vous transmettez à la fonction create seront passés dans votre rappel de définition de modèle comme deuxième argument.


Dans votre cas, vous n'avez même pas besoin d'accéder à ces attributs, car ils seront automatiquement fusionnés dans:

$business = factory(App\Business::class)->create();

factory(App\User::class, 5)->create([
    'business_id' => $business->id,
]);

Adaptez cela à vos besoins.

76
Joseph Silber

Mon code pour ajouter des utilisateurs 'Admin' polymorphes était:

// run model factory
factory(App\Admin::class, 3)->create()->each(function ($admin) {

    $admin->user()->save(

        // solved: https://laravel.com/docs/master/database-testing#using-factories (Overriding attributes)
        factory(App\User::class)->make([
              'userable_id' => $admin->id,
              'userable_type' => App\Admin::class
        ])
    );
});

J'espère que cela t'aides.

4
Robin Hood