就像上面写的 Flask 一样,使用 Doctrine DataFixtures。
节省自己的时间,避免 Alice Bundle / library。我一开始在一个项目中使用它,但很快就不得不删除它。您对生成的数据没有足够的控制权。
- 例如,您希望一个团队中有 3 个随机玩家,一切正常,但没有办法说他们必须是唯一的。至少那是我遇到最多问题的场景之一。
但是是的,使用 faker 库。
我要给你的另一个建议是,在你的每个 Fixtures 类中实现类似 ->initSeed() 的方法,你在 ->load() 方法的开头调用它。它会这样调用:
$this->faker->seed(100);
还要让您的灯具实现 OrderedFixtureInterface,这样您就可以控制首先插入的内容。这是关键......你在 load() 中实现 initSeed(),而不是在构造函数中,因为在所有类的开头都调用了构造函数,因为需要 getOrder() 方法来找出优先级。这样,如果您在夹具文件的末尾添加另一个随机属性,下一个文件仍然会生成相同的数据,因此夹具文件之间不会相互依赖。
如果您需要任何代码示例,请告诉我,我可以提供帮助。
保存参考的代码:
在 LoadTeamData 夹具类中,有一个常量:
const NUM = 10;
因此,您可以在其他夹具文件中访问它。
当您在 for 循环中生成团队时,使用索引 $i 来保存引用。
// Generate teams
for ($i=0; $i<self::NUM; $i++) {
$team = new Team();
// ... set things
$this->setReference('team-'.$i, $team)
$manager->persist($team);
}
$manager->flush();
然后以LoadPlayerData里面为例:
// For each team, generate some players
for ($t=0; $t<LoadTeamData::NUM; $t++) {
$team = $this->getReference('team-'.$t);
for ($i=0; $i<self::NUM; $i++) {
$player = new Player($team);
// ... set things
$manager->persist($player);
}
}
$manager->flush();