Symfony 带必填字段的条令类表继承查询

Symfony 带必填字段的条令类表继承查询,symfony,doctrine,discriminator,class-table-inheritance,Symfony,Doctrine,Discriminator,Class Table Inheritance,我的域有一个父类IncidenceMessage类和几个子类(即incidencemessageext)。 我有以下类表继承配置: Domain\Model\IncidenceMessage\IncidenceMessage: type: entity repositoryClass: Infrastructure\Domain\Model\IncidenceMessage\DoctrineIncidenceMessageRepository table: inciden

我的域有一个父类
IncidenceMessage
类和几个子类(即
incidencemessageext
)。 我有以下类表继承配置:

Domain\Model\IncidenceMessage\IncidenceMessage:
    type: entity
    repositoryClass: Infrastructure\Domain\Model\IncidenceMessage\DoctrineIncidenceMessageRepository
    table: incidence_messages
    inheritanceType: JOINED
    discriminatorColumn:
        name: type
        type: string
        length: 30
    discriminatorMap:
        text: IncidenceMessageText
        image: IncidenceMessageImage
        audio: IncidenceMessageAudio
        video: IncidenceMessageVideo
    fields:
        ...
我可以正确创建任何
IncidenceMessage
实体

数据库中只有一个
IncidenceMessageText
,当我尝试获取关联消息时,我得到以下错误:

TypeError: Argument 1 passed to Domain\Model\File\FileId::__construct() must be of the type string, null given
FileId
是表示文件实体id的值对象)

IncidenceMessageImage
有一个作为外键的
文件
字段,它是必需的

IncidenceMessageText
没有该字段时,条令获取
文件
对我来说毫无意义

在调试过程中,我发现条令对每个
IncidenceMessage
表都使用左连接进行选择,这将调用我的
FileTypeId::convertToPHPValue
方法:

class FileIdType extends Type
{
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return new FileId($value);
    }
}

好吧,这里的问题是子类有必填字段,但这不应该是一个障碍,对吧?

我找到了一个可能的解决方法。在自定义DBAL类型
FileIdType
上,我在实例化
FileId
之前检查了该值是否为null:

use Doctrine\DBAL\Types\Type;

class FileIdType extends Type
{
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value ? new FileId($value) : null;
    }
}

条令本身从不使用类的构造函数。所有操作都是使用反射来直接访问类属性的。您的代码正在某处运行new FileId()。@Cerad实际上,new FileId()是自定义DBAL类型(方法convertToPHPValue),但我不明白调用它的原因。