2015-09-06 20 views
7

W jaki sposób definiujesz klucze obce w fabryce modeli. Na przykład jeśli mam tabeli organizacje, które ma klucz obcy do tabeli krajów, w moim modelu fabryki Mam do określenia wartości obojętne dla identyfikatora kraju następująco:Klucze obce języka Laravel 5.1 w modelu fabryki

$factory->define(App\Organisation::class, function ($faker) { 
    return [ 
     'name' => $faker->company, 
     'country_id' => 197, 
    ]; 
}); 

W moim stole organizacje siewnika class Robię co następuje, ale obiekt faker nie jest obecny - czy muszę utworzyć nowy obiekt faker w mojej klasie siewnika?

use Illuminate\Database\Seeder; 

class OrganisationsTableSeeder extends Seeder 
{ 

    public function run() 
    { 
     $countryIds = Country::lists('id')->all(); 

     factory('App\Organisation', 3)->create([ 
     // override factory default 
     'country_id' => $faker->randomElement[$countryIds], 
    ]); 
    } 
} 

siewnik Database klasa

class DatabaseSeeder extends Seeder 
{ 
    public function run() 
    { 

     Model::unguard(); 

     $this->call('CountriesTableSeeder'); 
     $this->call('OrganisationsTableSeeder'); 

     Model::reguard(); 
    } 
} 

Co najlepszym sposobem definiowania kluczy obcych podczas definiowania modelu fabryki? Czy można pominąć parametr country_id z fabryki modelu i dodać go do klasy siewnika - z dokumentacji wydaje się, że można tylko zastąpić istniejącą wartość zdefiniowaną w fabryce modelu, ale nie można dodać nowej wartości za pośrednictwem klasy siewnika - poprawne mnie, jeśli się mylę?

Odpowiedz

2

Być może trochę się spóźniłem, ale miałem ten sam problem, to naprawiło to dla mnie. Powinieneś być w stanie zrobić

$factory->define(App\Organisation::class, function ($faker) { 
    return [ 
     'name' => $faker->company, 
     'country_id' => factory(App\Country::class)->create()->id, 
    ]; 
}); 

a następnie w swojej nasion wystarczy zadzwonić

factory(App\Organisation::class, 5)->create(); 

i stworzy krajom dla Ciebie.

+3

Problem z rozwiązaniem jest to, że każda "organizacja" będzie miała jeden inny kraj i nigdy nie użyje istniejącego, prawda? –

+0

mmmmh, minęło trochę czasu odkąd napisałem ten kod, ale twoja obserwacja wydaje się słuszna, chociaż tak naprawdę nie obchodziło mnie używanie istniejącego kraju w czasie, kiedy go pisałem. –

0

Sposób, w jaki sugerują zespół Laravel, Otwell, Stauffer i inni, jest taki.

Testing>Adding Relations To Models

Adding relationships to your models

ModelFactory.php

$factory->define(App\Organisation::class, function ($faker) { 
    return [ 
     'name' => $faker->company, 
     'country_id' => 197, 
    ]; 
}); 

$factory->define(App\Country::class, function ($faker) { 
    return [ 
     'name' => $faker->country, 
    ]; 
}); 

siewnik

$organisations = factory('App\Organisation', 3) 
    ->create() 
    ->each(function($$organisation) { 
     $organisation->relatedItems()->save(factory('App\Country')->make()); 
    });