【问题标题】:php create fixtures with automatic relationsphp创建具有自动关系的夹具
【发布时间】:2016-06-30 12:07:11
【问题描述】:

我目前正在研究一个具有大量数据关系的网站的固定装置。

假设有一个与团队表相关的联赛表,它与成员表相关。我简要检查了 Alice 库以处理数据“随机化”和其他内容。

但我有一个问题,是否有一个库(或方式),可以让我创建“依赖”固定装置?

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

每当我调用 create League 固定装置时,它都会创建所有依赖项。

【问题讨论】:

    标签: php symfony fixtures


    【解决方案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'));
    

    【讨论】:

    • 当然,但这不是真正的模板方式,或者我可能不明白(还)。执行团队夹具时,应自动执行用户/成员部分。我可能自己可以编写这个逻辑,只是好奇是否有任何库已经解决了这个问题。
    【解决方案2】:

    就像上面写的 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();
    

    【讨论】:

    • 谢谢,我会尝试测试一下。但不确定这是否能解决我在执行团队夹具时自动执行 10 个成员夹具的“问题”。我会看看订购的灯具和其他提到的东西
    • 我已经用一个未经测试的简短示例更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2021-03-30
    • 1970-01-01
    • 2011-04-16
    • 2018-01-12
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多