Laravel 5.1外键模型工厂

ada*_*m78 7 foreign-keys seeding faker laravel-5.1

如何在模型工厂中定义外键.例如,如果我有一个组织表,其中包含国家/地区表的外键,则在我的模型工厂中,我必须为国家/地区ID定义虚拟值,如下所示:

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

在我的组织表中播种器类我正在做以下但是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],
    ]);
   }
}
Run Code Online (Sandbox Code Playgroud)

数据库播种者类

class DatabaseSeeder extends Seeder
{
     public function run()
     {

        Model::unguard();

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

        Model::reguard();
     }
}
Run Code Online (Sandbox Code Playgroud)

什么是定义模型工厂时定义外键的最佳方法?是否可以从模型工厂中省略country_id并将其添加到播种器类中 - 从文档中可以看出,您只能覆盖模型工厂中定义的现有值,但是您无法通过播种器类添加新值 - 正确我,如果我错了?

Dan*_*oli 2

我可能在这方面有点晚了,但我遇到了同样的问题,这为我解决了它。你应该能够做到

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

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

factory(App\Organisation::class, 5)->create();
Run Code Online (Sandbox Code Playgroud)

它也会为你创建国家。

  • 这一解决方案的问题在于,每个“组织”都会有一个不同的国家,并且永远不会使用现有的国家,对吧? (3认同)