2015-09-06 71 views
7

如何在模型工厂中定义外键?例如,如果我有有一个外键国家表组织表,在我的模型厂我有如下定义为国家ID的虚拟值:Laravel 5.1模型工厂的外键

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

在我的组织表播种机我正在做下面的工作,但faker对象不存在 - 是否需要在我的播种器类中创建一个新的faker对象?

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

数据库播种机类

class DatabaseSeeder extends Seeder 
{ 
    public function run() 
    { 

     Model::unguard(); 

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

     Model::reguard(); 
    } 
} 

最新最好的方式来定义模型工厂当定义外键?是否可以从模型工厂中省略country_id并将其添加到seeder类中 - 从文档看来,您似乎只能覆盖模型工厂中定义的现有值,但不能通过播种器类添加新值 - 正确我如果我错了?

回答

2

我可能在这一个有点晚,但我有同样的问题,这固定了我。你应该能够做到

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

,然后在你的种子,你只需要调用

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

,它会创建国家你。

+3

的与问题这个解决方案是,每个“组织”将有一个不同的国家,它不会使用现有的国家,对吧? –

+0

mmmmh,自从我写这段代码以来已经有一段时间了,但你的观察看起来是正确的,尽管我在写代码的时候并不在意使用现有的国家。 –

0

Laauvel团队Otwell,Stauffer et.al.提出的方式就是这样。

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

播种机

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