Дискриминатор в объединенном столе с Doctrine2

У меня есть абстрактный родительский класс под названием Divers, который расширен несколькими другими классами.
Итак, я использую отображение наследования с D2, используя стратегию наследования одной таблицы.

namespace MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * ParentClass
 * 
 * @ORM\Table(name="PARENTCLASS")
 * @ORM\Entity
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="idtable", type="string")
 * @ORM\DiscriminatorMap({
 *      "CHILD-CLASS1" = "ChildClassOne",
 *      "CHILD-CLASS2" = "ChildClassTwo",
 *      "CHILD-CLASS3" = "ChildClassThree",
 *      "CHILD-CLASS4" = "ChildClassFour"
 * })
 */
abstract class ParentClass
{
    ...
}

Чего я хочу добиться, так это отобразить в браузере дискриминатор с небольшим описанием, объясняющим, что это такое для пользователя.
Я гуглил решение, как положить дискриминатор в объединенную таблицу, но ничего не нашел.

Есть ли у вас какие-либо советы для достижения моей цели?

Заранее спасибо за вашу помощь.

1 ответ

Решение

Столбец дискриминатора имеет особое значение для Доктрины 2 и поэтому не может быть частью отношения.

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

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

Вы можете добиться этого с помощью PHP, не добавляя еще одно поле в базу данных, если вам не нужно это поле в SQL-запросе.

Поскольку дискриминатор является abstract class, просто добавление общедоступного абстрактного метода, возвращающего ваше жестко заданное значение дискриминатора, поможет. Затем вы можете использовать свою сущность в twig или сериализаторе json.

abstract class ParentClass {
    public abstract function getDiscriminator(): string; // The discriminator type
}

class ChildClassOne extends ParentClass
{
    public function getDiscriminator(): string 
    {
        return 'CHILD-CLASS1'; 
    }
}

Если вам нужно получить в SQL, используйте $qb->andWhere($qb->isInstanceOf(ChildClassOne::class)) поскольку атрибут метода или дискриминатора недоступен в sql.

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