В моем домене есть родительский класс 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)
IncidenceMessageImage
имеет поле File
, которое является внешним ключом, и оно обязательно.
Для меня не имеет смысла, что Doctrine извлекает File
, когда IncidenceMessageText
не имеет этого поля.
Во время отладки я обнаружил, что доктрина выполняет SELECT с LEFT JOIN для каждой отдельной таблицы IncidenceMessage
, и это вызывает мой метод FileTypeId::convertToPHPValue
:
class FileIdType extends Type
{
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return new FileId($value);
}
}
Насколько я знаю, проблема здесь в том, что в дочерних классах есть обязательные поля, но это не должно быть препятствием, верно?