Laravel:使用模型工厂生成一对多关系

Luk*_*ell 7 factory one-to-many laravel eloquent

我在 Laravel 中使用工厂为模型生成多个一对多关系时遇到问题。工厂似乎每个俱乐部只生成一个 ClubFixture,而他们应该为每个 Club 生成 5 个 ClubFixture。

楷模

俱乐部

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Club extends Model
{
  //Table associated with the model
  protected $table = 'clubs';

   protected $fillable = ['name', 'league', 'age_group', 'colour', 'county', 'country'];

   public function fixtures(){
     return $this->hasMany('App\ClubFixture', 'club_id', 'id');
   }
}
Run Code Online (Sandbox Code Playgroud)

俱乐部装置

namespace App;

use Illuminate\Database\Eloquent\Model;

class ClubFixture extends Model
{
  //Table associated with the model
  protected $table = 'club_fixtures';
}
Run Code Online (Sandbox Code Playgroud)

模态工厂

$factory->define(App\Club::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'league' => $faker->word,
        'age_group' => $faker->word,
        'colour' => $faker->hexcolor,
        'county' => $faker->state,
        'country' => $faker->country,
        'emblem' => $faker->imageUrl(80, 80),
        'banner' => $faker->imageUrl,
        'matches' => $faker->randomDigit,
        'wins' => $faker->randomDigit,
        'losses' => $faker->randomDigit,
    ];
});

$factory->define(App\ClubFixture::class, function (Faker\Generator $faker) {
    return [
        'club_id' => function () {
            return factory(App\Club::class)->create()->id;
        },
        'opposition' => $faker->name,
        'address' => $faker->address,
        'datetime' => $faker->dateTimeBetween('now', '+30 weeks'),
        'type' => $faker->randomElement(['home', 'away', 'none']),
    ];
});
Run Code Online (Sandbox Code Playgroud)

数据库播种机

factory(App\Club::class, 100)->create()->each(function ($u) {
     factory(App\ClubFixture::class, 5)->create();
});
Run Code Online (Sandbox Code Playgroud)

预期结果:每个俱乐部都应该有 5 个与之关联的俱乐部装置

实际结果:有些俱乐部没有俱乐部固定装置,有些只有一个。

我试过这个答案,但得到一个错误,saveMany不存在并且关系为空。

您可以在此处下载 SQL 结果数据库。

有人能告诉我我在这里做错了什么吗?

bai*_*kho 7

您的模型模型工厂看起来不错,但可以将它们与此播种机一起使用:

use Illuminate\Database\Seeder;

class ClubSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Club::class, 100)->create()->each(function($c) {
            /** @var \App\Club $c */
            $c->fixtures()->saveMany(
                factory(App\ClubFixture::class, 5)->make(['club_id' => NULL])
            );
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

确保saveMany()fixtures()Club 模型的关系方法上调用该方法。最后还要覆盖club_id5 个 ClubFixtures 的每次迭代,以防止再次创建 Club。否则,您最终会得到 600 个俱乐部(而不是 100 个俱乐部)和 500 个俱乐部装置。