【发布时间】:2019-10-11 10:31:58
【问题描述】:
我的域有一个父类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 实体。
数据库中只有一个IncidenceMessageText,当我尝试获取事件消息时,我收到以下错误:
TypeError: Argument 1 passed to Domain\Model\File\FileId::__construct() must be of the type string, null given
(FileId是一个值对象,代表一个File实体的id)
IncidenceMessageImage 有一个 File 字段,它是一个外键,它是必需的。
当 IncidenceMessageText 没有该字段时,Doctrine 获取 File 对我来说毫无意义。
在调试时,我发现教义对每个 IncidenceMessage 表执行带有 LEFT JOIN 的 SELECT,这调用了我的 FileTypeId::convertToPHPValue 方法:
class FileIdType extends Type
{
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return new FileId($value);
}
}
AFAIK,这里的问题是子类有必填字段,但这不应该成为一个障碍,对吧?
【问题讨论】:
-
Doctrine 本身从不使用类的构造函数。一切都是使用反射来直接访问类属性完成的。您的代码正在某处运行 new FileId()。
-
@Cerad 实际上,new FileId() 是自定义 DBAL 类型(方法 convertToPHPValue),但我不明白为什么要调用它。
标签: symfony doctrine discriminator class-table-inheritance