php创建具有自动关系的灯具

时间:2016-06-30 12:07:12

标签: php symfony fixtures

我目前正在寻找一个网站的灯具,这些网站之间有很多关系。

假设有一个与球队表相关的联赛表,该表与成员表有关。我简要地检查了Alice库来处理数据“随机化”和其他东西。

但是我有一个问题,是否有一个库(或方式),这将允许我创建“依赖”灯具?

例如,我会为联盟设置模板以自动创建20个团队,其中每个团队将根据某些已定义的结构自动创建10个成员。

每当我调用create league fixture时,它都会创建所有依赖项。

2 个答案:

答案 0 :(得分:1)

official documentation中所述,您可以在灯具中使用对象引用

    $userAdmin = new User();
    $userAdmin->setUsername('admin');
    $userAdmin->setPassword('test');

    $manager->persist($userAdmin);
    $manager->flush();

    $this->addReference('admin-user', $userAdmin);

    // in another fixture

    $userGroupAdmin = new UserGroup();
    $userGroupAdmin->setUser($this->getReference('admin-user'));

答案 1 :(得分:1)

像上面写的Flask一样,使用Doctrine DataFixtures。

节省时间并避免使用Alice Bundle / library。我在一个项目开始使用它,但不得不很快删除它。您根本无法控制生成的数据。

  • 例如,你想要一个团队中的3个随机玩家,一切都没问题,但是没有办法说它们必须是唯一的。至少那是我遇到的最多问题之一。

但是,请使用faker库。

我会给你的另一个建议是,在你的每个Fixtures类中实现类似于> initSeed()的方法,你可以在 - > load()方法的开头调用它。它会调用这样的东西:

$this->faker->seed(100);

还要使你的灯具实现OrderedFixtureInterface,这样你就可以先控制插入的内容。这里有一个问题......你在load()中实现了initSeed(),而不是在构造函数中,因为构造函数在所有类的开头都被调用,因为需要getOrder()方法来找出优先级。这样,如果在fixture文件的末尾添加另一个随机属性,接下来的文件仍会生成相同的数据,因此fixture文件不会相互依赖。

如果您需要任何代码示例,请告诉我,我可以提供帮助。

保存参考的代码:

在LoadTeamData fixture类中,有一个常量:

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