查询 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;
}
}
我的域有一个父域 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
:
use Doctrine\DBAL\Types\Type;
class FileIdType extends Type
{
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value ? new FileId($value) : null;
}
}