Дискриминатор в объединенном столе с 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.