gpt4 book ai didi

Laravel : using model factories to generate one-to-many relationships

转载 作者:行者123 更新时间:2023-12-04 22:27:58 26 4
gpt4 key购买 nike

我在 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');
}
}

ClubFixture

namespace App;

use Illuminate\Database\Eloquent\Model;

class ClubFixture extends Model
{
//Table associated with the model
protected $table = 'club_fixtures';
}

模态工厂
$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']),
];
});

数据库播种器
factory(App\Club::class, 100)->create()->each(function ($u) {
factory(App\ClubFixture::class, 5)->create();
});

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

实际结果:有些俱乐部没有ClubFixture,有些只有俱乐部。

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

您可以下载 SQL 生成的数据库 here

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

最佳答案

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

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

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

关于Laravel : using model factories to generate one-to-many relationships,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49076855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com