Запрос на наследование таблицы классов Doctrine с обязательными полями

В моем домене есть родительский класс 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);
    }
}

Насколько я знаю, проблема здесь в том, что в дочерних классах есть обязательные поля, но это не должно быть препятствием, верно?


person jerkan    schedule 11.10.2019    source источник
comment
Сама Doctrine никогда не использует конструктор класса. Все делается с использованием отражения для прямого доступа к свойствам класса. В вашем коде где-то запущен новый FileId().   -  person Cerad    schedule 11.10.2019
comment
@Cerad На самом деле, new FileId() относится к пользовательскому типу DBAL (метод convertToPHPValue), но я не понимаю, почему он вызывается.   -  person jerkan    schedule 11.10.2019


Ответы (1)


Я нашел возможный обходной путь. В моем пользовательском типе DBAL FileIdType я проверил, было ли значение нулевым перед созданием экземпляра FileId:

use Doctrine\DBAL\Types\Type;

class FileIdType extends Type
{
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value ? new FileId($value) : null;
    }
}
person jerkan    schedule 13.10.2019