2

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

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

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

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

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

我的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 负责左填充操作)。例如:给定一个 Foo 实例,其id属性值为87,关联的 Bar 实例的fooDbId属性应等于“00000087”。

谢谢你。

4

2 回答 2

0

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

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

假设 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 将一如既往地为您添加外键。

于 2018-04-05T04:25:53.200 回答
0

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

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

于 2018-04-04T15:21:34.710 回答