Что такое конфликт поля дискриминатора в PHP Doctrine MongoDB ODM?

Что значит ошибка

Discriminator field "x" in "y" conflicts with a mapped field's "name" attribute.

брошено?

Более конкретно я имею в виду это условие:

    if ($this->discriminatorField !== null && $this->discriminatorField === $mapping['name']) {
        throw MappingException::discriminatorFieldConflict($this->name, $this->discriminatorField);
    }

Реферальный код

вставьте свои аннотации для обоих классов

delboy1978uk 25.05.2018 14:11

хорошо, я уверен, что может быть несколько причин @ delboy1978uk, я вставлю их сейчас

Luka Žitnik 25.05.2018 14:15

оказывается, я бы вставил пример Person / SuperUser (наследование одной коллекции) из документации. единственное отличие - это абстрактный класс без аннотаций, которые расширяет Person, но когда я удаляю это отношение, я все равно получаю ту же ошибку @ delboy1978uk

Luka Žitnik 25.05.2018 14:34

@ delboy1978uk Я не совсем прав. У меня была аннотация @String для сопоставления свойства с полем дискриминатора. Но когда я узнал, мне потребовалось больше времени, чтобы исследовать. Если есть какая-либо аннотация поля, даже @String, будет выброшено исключение. Похоже, авторы хотели подчеркнуть, что поле дискриминатора может иметь только строковые значения, но я не могу быть уверен, потому что в документах только сказано, что @String не соответствует сопоставлению типов свойств, без исключений - что за каламбур :)

Luka Žitnik 25.05.2018 17:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
454
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поля дискриминатора не должны быть сопоставлены со свойствами, поэтому вы видите исключение. Теоретически разработчики не должны интересоваться значением поля дискриминатора, поскольку ODM может решить, какой объект должен быть создан или как запрашивать документы в случае наследования одной коллекции. В пользовательской среде все, о чем вам следует беспокоиться, - это тип класса, с которым вы работаете.

Теперь для некоторой истории исключение было введено в БЕТА-10 в 2013 году, но раньше было невозможно сопоставить дискриминатор со свойством, фиксация, похоже, усиливает защиту и вводит исключение, которое менее запутанно. Учитывая предыдущие изменения, сделанные 6 лет назад, я бы сказал, что никогда не было возможности получить доступ к полям дискриминатора через сопоставленные свойства.

Я подумал, что, вероятно, мне следует оставить свойство в унаследованном классе, чтобы код, на который я никогда не смотрел, продолжал использовать его, как он. Но, возможно, я ошибаюсь в этом. Я поражен тем усилием, которое вы вложили в свои аргументы. Здорово, что ты рядом.

Luka Žitnik 29.05.2018 16:03

Другие вопросы по теме