【问题标题】:Alice fixtures - Persist and reference a first set of entities/objectsAlice 固定装置 - 持久化并引用第一组实体/对象
【发布时间】:2018-04-04 10:38:43
【问题描述】:

Alice 在 3.x 中放弃了持久层。

在尝试从 2.2 迁移到 3.0.x 时,...
我需要先加载并保留一些固定装置(以便填充它们的 id),然后从另一组固定装置文件中引用这些实体 ID。
如何实现?

我想我可能需要分别循环和加载多个夹具文件集,但我不知道在这种情况下对象引用将如何存在。

我的设置目前不起作用但导致提示以下错误:

对象“bar1”的属性“fooDbId”的值无效 (类:Doctrine\Model\Bar)。

我的FixturesLoader.php

// …
use Nelmio\Alice\Loader\NativeLoader as AliceLoader;
// …
$loader = new AliceLoader();
$entities = $loader
    ->loadFiles(
        [
            __DIR__.'/foo.yml',
            /* ↓ Some more fixture files ↓ */,

           # Here comes "bar" which references persisted foo entities id
           # through its "fooDbId" property using expresion '@foo1->id'
            __DIR__.'/bar.yml'
        ],
        ['locale' => 'en_EN']
    )
    ->getObjects();

foreach ($entitites as $entity) {
    $manager->persist($entity)
}

$manager->flush();

bar.yml

Doctrine\Model\Bar:
    bar1:
        fooDbId: '@foo1->id'
        # ↓ More properties ↓

编辑

fooDbId 不是“真正的”关系/外键字段,而是 0 左侧填充的 Foo 实体 ID。 (Bar::setFooDbId 负责左填充操作)。例如:给定一个 id 属性值为 87 的 Foo 实例,关联的 Bar 实例的 fooDbId 属性应该等于 '00000087'。

谢谢。

【问题讨论】:

    标签: symfony4 nelmio-alice alice-fixtures


    【解决方案1】:

    我想我可能需要分别循环和加载多个夹具文件集,但我不知道在这种情况下对象引用将如何存在

    加载一组固定装置时,您可以注入参数和对象。因此,如果您加载 2 个文件,您可以将其持久化,然后加载剩余的文件,并将之前加载的结果传递给它。

    【讨论】:

    • 谢谢,我会检查一下。目前我已经硬编码了预期的 id。
    【解决方案2】:

    首先,没有必要为每个实体创建单独的“yml”文件。

    其次,据我了解,您试图在教义上伪造您的多对一关系。如果是这样,您不需要这种方法。 Doctrine 总是帮助你考虑对象而不是数据库。以下是 Alice 将如何帮助的示例。

    假设 Bar 实体与 Foo 具有多对一关系。这是一个例子:

    App\Entity\Foo:
        foo_{1..10}:
            title: <text(20)>
            isFeatured: <boolean(50)>
    
    App\Entity\Bar:
        bar_{1..10}:
            username: <userName()>
            foo: '@foo_1' # This will assign the first foo generated above#
    
            foo: '@foo_*' # This will assign one the 10 generated foos above randomly!#
    

    同样,Doctrine 将一如既往地为您添加外键。

    【讨论】:

    • 感谢您的宝贵时间。我知道如何正确处理从一个夹具到另一个夹具的 ManyToOne 关系引用。在我的情况下,fooDbId 必须是一个字符串/整数 id,它将通过 Bar fooDbId 属性 setter 应用0 左填充,该值必须是保持原样(例如 00000087)。我知道这听起来很奇怪,但这是其他项目(共享同一个数据库)工作所必需的。顺便说一句,我们将夹具放在自己的文件中,以便在查看项目目录树时从代码编辑器中进行搜索。
    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多