Атрибут 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,
который позволяет наследовать поля без создания таблицы