Laravel 5.1外键模型工厂

时间:2015-09-06 15:56:46

标签: foreign-keys laravel-5.1 seeding faker

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

$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并将其添加到播种器类中 - 从文档中可以看出,您只能覆盖模型工厂中定义的现有值,但是您无法通过播种器类添加新值 - 正确我,如果我错了吗?

2 个答案:

答案 0 :(得分: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();

它也将为您创建国家/地区。

答案 1 :(得分:0)

Laravel团队,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());
  });