【问题标题】:Laravel 5.1 foreign keys in model factory模型工厂中的 Laravel 5.1 外键
【发布时间】:2015-12-02 05:27:30
【问题描述】:

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

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

在我的组织表播种器类中,我正在执行以下操作,但伪造者对象不存在 - 我是否需要在我的播种者类中创建一个新的伪造者对象?

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

【问题讨论】:

    标签: foreign-keys laravel-5.1 seeding faker


    【解决方案1】:

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

    $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();
    

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

    【讨论】:

    • 这个解决方案的问题是每个organization 将有一个不同的国家,它永远不会使用现有的国家,对吧?
    • mmmmh,我写这段代码已经有一段时间了,但你的观察似乎是正确的,虽然我在写它的时候并不真正关心使用现有的国家/地区。
    【解决方案2】:

    Laravel 团队 Otwell、Stauffer 等人建议的方式是这样的。

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

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 2019-06-21
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2015-09-16
      • 2015-10-21
      • 2018-06-13
      • 2021-01-26
      相关资源
      最近更新 更多