2015-09-06 25 views
7

Come si definiscono le chiavi esterne in una factory del modello. Per esempio, se ho una tabella organizzazioni che ha una chiave esterna alla tabella paesi, nella mia fabbrica modello che sto avendo a definire un valore fittizio per l'ID paese come segue:Laravel 5.1 chiavi esterne nella factory di modello

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

Nel mio tavolo organizzazioni seminatrice classe Sto facendo quanto segue ma l'oggetto faker non è presente - ho bisogno di creare un nuovo oggetto faker nella mia classe seminatrice?

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

seminatrice Database classe

class DatabaseSeeder extends Seeder 
{ 
    public function run() 
    { 

     Model::unguard(); 

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

     Model::reguard(); 
    } 
} 

cosa è il modo migliore per definire le chiavi esterne al momento di definire le fabbriche modello? È possibile omettere country_id dalla factory del modello e aggiungerlo invece alla classe di seeder: dal documention sembra che sia possibile ignorare solo un valore esistente definito nella factory del modello ma non è possibile aggiungere un nuovo valore tramite la classe seeder - correct me se mi sbaglio?

risposta

2

Potrei essere un po 'in ritardo su questo, ma stavo avendo lo stesso problema, questo lo ha risolto per me. Si dovrebbe essere in grado di fare

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

e poi nel tuo seme è sufficiente chiamare

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

e creerà i paesi per voi pure.

+3

Il problema con questa soluzione è che ogni "organizzazione" avrà un paese diverso e non ne userà mai uno esistente, giusto? –

+0

mmmmh, è passato un po 'di tempo da quando ho scritto questo codice, ma la tua osservazione sembra corretta, anche se non mi interessava davvero usare un paese esistente nel momento in cui l'ho scritto. –

0

Il modo in cui il team Laravel, Otwell, Stauffer et.al. suggerisce, è come questo.

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

seminatrice

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