0

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

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实体。

只有一个IncidenceMessageTextin 数据库,当我尝试获取事件消息时,我收到以下错误:

TypeError: Argument 1 passed to Domain\Model\File\FileId::__construct() must be of the type string, null given

FileId是一个值对象,表示 File 实体的 id)

IncidenceMessageImageFile一个外键字段,它是必需的。

FileDoctrine在IncidenceMessageText没有该字段时获取对我来说毫无意义。

在调试时,我发现教义对每个IncidenceMessage表都使用 LEFT JOIN 进行 SELECT,这调用了我的FileTypeId::convertToPHPValue方法:

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

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

4

1 回答 1

0

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

use Doctrine\DBAL\Types\Type;

class FileIdType extends Type
{
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value ? new FileId($value) : null;
    }
}
于 2019-10-13T13:57:28.347 回答