2015-09-06 17 views
7

Wie definieren Sie Fremdschlüssel in einer Modellfabrik? Zum Beispiel, wenn ich eine Tabelle Organisationen habe, die einen Fremdschlüssel für die Länder-Tabelle hat, in meinem Modell Fabrik habe ich einen Dummy-Wert für das Land ID wie folgt zu definieren:Laravel 5.1 Fremdschlüssel in Modellfabrik

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

In meiner Organisationen Tabelle Seeder Klasse Ich mache folgendes, aber das Faker-Objekt ist nicht vorhanden - muss ich ein neues Faker-Objekt in meiner Seeder-Klasse erstellen?

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], 
    ]); 
    } 
} 

Database Seeder Klasse

class DatabaseSeeder extends Seeder 
{ 
    public function run() 
    { 

     Model::unguard(); 

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

     Model::reguard(); 
    } 
} 

Was ist der beste Weg, um die Fremdschlüssel zu definieren, wenn Modellfabriken definieren? Ist es möglich, die country_id aus der Modellfabrik wegzulassen und stattdessen in der Seeder-Klasse hinzuzufügen - aus der Dokumentation scheint es, dass Sie nur einen in der Modellfabrik definierten Wert überschreiben können, aber über die Seder-Klasse keinen neuen Wert hinzufügen können - korrekt ich, wenn ich falsch liege?

Antwort

2

Ich bin vielleicht ein bisschen spät dran, aber ich hatte das gleiche Problem, das hat es für mich behoben. Sie sollten

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

und dann in deinem Samen Lage zu tun, müssen Sie nur

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

nennen und es werden die Länder auch für Sie erstellen.

+3

Das Problem mit Diese Lösung besteht darin, dass jede "Organisation" ein anderes Land hat und niemals ein bestehendes verwendet, richtig? –

+0

mmmmh, es ist eine Weile her, seit ich diesen Code geschrieben habe, aber deine Beobachtung scheint korrekt zu sein, obwohl es mir nicht wirklich wichtig war, ein existierendes Land zu dem Zeitpunkt zu benutzen, als ich es schrieb. –

0

Die Art und Weise, wie das Laravel-Team, Otwell, Stauffer et.al., vorschlagen, ist so.

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, 
    ]; 
}); 

Seeder

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