2015-09-03 48 views
8

Mam tabelę users i relację jeden-do-zero/jeden z tabelą businesses (users.user_id => firmy.user_id). Na moim stole users mam dyskryminatora, który mówi mi, jeśli użytkownik jest typu firmy, a więc muszę mieć również szczegóły na tabeli businesses.Jak przekazywać argumenty do fabryk Laravel?

Chcę utworzyć moich użytkowników z moją fabryką, która aktualnie działa, a następnie tworzę tylko dane firmy, w których dyskryminator wskazuje na konto firmowe.

Mam trzy opcje w moim umyśle:

  1. stworzyć z fabryki użytkowników, a następnie za pomocą „-> each()” zrobić kilka kontroli dyskryminatora i utworzyć nowego użytkownika biznesowych przy użyciu fabryki. Jednak nie mogę przekazać do fabryki firmy user_id, do której został przypisany użytkownik.
  2. Najpierw utwórz użytkowników. Następnie w moim Business seederie wyszukuj wszystkich użytkowników, którzy pasują do dyskryminatora biznesowego. Następnie dla wszystkich tych użytkowników uruchomić fabrykę, która tworzy szczegóły biznesowe. Ale znowu, musiałbym połączyć jakoś user_id z już utworzonym użytkownikiem z fabryką biznesu user_id.
  3. W mojej fabryce firmy utwórz nowego użytkownika i pobierz identyfikator, tworząc w ten sposób połączenie między users.user_id i business.user_id. Jednak używam generatora losowego dla user.user_type, więc nawet jeśli mam wypełniony tabelę businesses, może to być dla użytkowników, którzy mają dyskryminator jako "osobisty".

Czy istnieje inny sposób? Czy mogę przekazać argumenty z mojego Seedera do fabryki?

Odpowiedz

30

Atrybuty przekazywane do funkcji create będą przekazywane do wywołania definicji modelu jako drugi argument.


W twoim przypadku nie trzeba nawet mieć dostęp do tych atrybutów, ponieważ zostaną one automatycznie połączone w:

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

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

Dostosowanie do Twoich potrzeb.

+0

Jak mogłem to przegapić. Obserwowałem lekcję Laracasta i wiem, że pamiętam o ustawianiu rzeczy. Oczywiście było to również w dokumentacji: http://laravel.com/docs/master/testing#model-factories. Wielkie dzięki. – Cristian

+0

@ Link Cristian wygląda obecnie nieaktualne, dla 5.4 zobacz https://laravel.com/docs/5.4/database-testing#using-factories i przewiń do "Persisting Models" – morph

+0

co z tego? '' 'php $ student-> assignRole (" student "); '' ' im przy użyciu spatie/pozwolenie –