РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
121 of 258 menu

Атрибут DiscriminatorMap

Атрибут DiscriminatorMap вешается на класс сущности и задаёт карту значений дискриминатора для стратегии наследования Single Table Inheritance или Joined Table Inheritance. Первым параметром передаётся массив, где ключ - это значение дискриминатора, а значение - имя класса сущности.

Синтаксис

#[DiscriminatorMap(['key' => EntityClass::class])]

Пример

Давайте создадим базовую сущность Animal с стратегией наследования Single Table Inheritance и картой дискриминатора:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORM\Entity] #[ORM\InheritanceType('SINGLE_TABLE')] #[ORM\DiscriminatorColumn(name: 'type', type: 'string')] #[ORM\DiscriminatorMap(['cat' => Cat::class, 'dog' => Dog::class])] class Animal { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private ?int $id = null; #[ORM\Column(type: 'string', length: 255)] private ?string $name = null; public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } } ?>

Теперь создадим дочерние сущности Cat и Dog:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORM\Entity] class Cat extends Animal { #[ORM\Column(type: 'boolean')] private bool $meows = true; public function meows(): bool { return $this->meows; } } ?>
<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORM\Entity] class Dog extends Animal { #[ORM\Column(type: 'boolean')] private bool $barks = true; public function barks(): bool { return $this->barks; } } ?>

Теперь при сохранении сущности Cat в колонку type автоматически запишется значение 'cat', а при сохранении Dog - 'dog'.

Пример

Давайте получим все записи из таблицы и выведем их тип:

<?php namespace AppController; use AppEntityAnimal; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class AnimalController extends AbstractController { #[Route('/animals', name: 'animal_index')] public function index(EntityManagerInterface $em): Response { $res = []; $animals = $em->getRepository(Animal::class)->findAll(); foreach ($animals as $animal) { $res[] = get_class($animal) . ': ' . $animal->getName(); } return new Response(implode(', ', $res)); } } ?>

Результат выполнения кода:

"AppEntityCat: abcde, AppEntityDog: hello"

Смотрите также

  • атрибут InheritanceType,
    который задаёт стратегию наследования сущностей
  • атрибут DiscriminatorColumn,
    который задаёт колонку дискриминатора
  • атрибут Entity,
    который помечает класс как сущность Doctrine
  • атрибут MappedSuperclass,
    который позволяет наследовать поля без создания таблицы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить