带有 DiscriminatorColumn 的 Symfony 实体工厂不起作用

问题描述 投票:0回答:1

我有这个实体Contact.php

#[ORM\DiscriminatorColumn(name: 'type', type: 'string')]
#[ORM\DiscriminatorMap([
    'person' => ContactType\Person::class,
    'family' => ContactType\Family::class,
    'company' => ContactType\Company::class,
])]

还有像这样的工厂:

protected function getDefaults(): array
    {
        return [
            'createdAt' => self::faker()->dateTime(),
            'isArchived' => 0,
            ...
            'type' => Person::class,
        ];
    }

在我的 AppFixtures 文件中,我有这样的内容:

public function load(ObjectManager $manager): void
    {
        $user = UserFactory::createOne();
        $contacts = ContactFactory::createMany(5, [
            'createdBy' => $user
        ]);

        $manager->flush();
    }

调用命令

php bin/console doctrine:fixtures:load
最终会出现此错误:

In Instantiator.php line 84:
                                                                                           
  Cannot set attribute "type" for object "App\Entity\Contact" (not public and no setter).  
                                                                                           

In PropertyAccessor.php line 544:
                                                                                      
  Could not determine access type for property "type" in class "App\Entity\Contact".  
                                                                                      

我的目标是拥有可用的夹具,以便我可以测试代码或只是创建自己的虚拟数据。 我不知道该怎么做,甚至不知道去哪里寻找。任何建议都非常欢迎。

php symfony doctrine-orm
1个回答
0
投票

DiscriminatorColumn
DisciminatorMap
用于类表继承 (https://www.doctrine-project.org/projects/doctrine-orm/en/2.17/reference/inheritance-mapping.html#class-table-继承)。

您指定 3 种映射类型(每一种都存在于 DiscriminatorMap 中):

Person
Family
Company

#[ORM\DiscriminatorMap([
    'person' => ContactType\Person::class,
    'family' => ContactType\Family::class,
    'company' => ContactType\Company::class,
])]

但是例外情况是您尝试创建一个联系人,但上面没有类型。

您可以使用 ContactFactory 编辑您的问题吗?您创建了 Contact 类还是 Person 类?

© www.soinside.com 2019 - 2024. All rights reserved.