查询 Doctrine class table 继承与必填字段

Query on Doctrine class table inheritance with required fields

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

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 有一个 File 字段是外键,它是必需的。

IncidenceMessageText 没有那个字段时,Doctrine 获取 File 对我来说毫无意义。

调试时,我发现 doctrine 对每个 IncidenceMessage table 执行 SELECT 和 LEFT JOIN,这调用了我的 FileTypeId::convertToPHPValue 方法:

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

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

我找到了可行的解决方法。在我的自定义 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;
    }
}