Запрос наследования таблиц классов Doctrine с обязательными полями - PullRequest
0 голосов
/ 11 октября 2019

Мой домен имеет родительский класс 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 с левыми соединениями для каждой таблицы IncidenceMessage, и это вызывает мой метод FileTypeId::convertToPHPValue:

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

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

1 Ответ

0 голосов
/ 13 октября 2019

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

use Doctrine\DBAL\Types\Type;

class FileIdType extends Type
{
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value ? new FileId($value) : null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...