Атрибут DiscriminatorColumn
Атрибут DiscriminatorColumn вешается на класс сущности
и задаёт колонку в таблице, которая хранит тип (класс) конкретной
записи при наследовании. Первым параметром передаётся имя колонки,
параметр type задаёт тип данных (по умолчанию 'string'),
параметр length - длину значения. Атрибут работает в паре
с InheritanceType и DiscriminatorMap.
Синтаксис
#[DiscriminatorColumn(name: name, type: type, length: length)]
Пример
Давайте создадим базовую сущность User с наследованием
и колонкой-дискриминатором user_type:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMInheritanceType('SINGLE_TABLE')]
#[ORMDiscriminatorColumn(name: 'user_type', type: 'string', length: 255)]
#[ORMDiscriminatorMap([
'user' => User::class,
'admin' => Admin::class,
])]
class User
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
public function getId(): int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
?>
Пример
Давайте создадим дочернюю сущность Admin, которая
расширяет User и получает значение дискриминатора 'admin':
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Admin extends User
{
#[ORMColumn(type: 'string', length: 255)]
private string $role;
public function getRole(): string
{
return $this->role;
}
public function setRole(string $role): void
{
$this->role = $role;
}
}
?>
Пример
Давайте сохраним сущности в базу и посмотрим, какое значение попадает в колонку-дискриминатор:
<?php
namespace AppController;
use AppEntityAdmin;
use AppEntityUser;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class UserController extends AbstractController
{
#[Route('/user', name: 'user_create')]
public function create(EntityManagerInterface $em): Response
{
$user = new User();
$user->setName('abcde');
$em->persist($user);
$admin = new Admin();
$admin->setName('hello');
$admin->setRole('root');
$em->persist($admin);
$em->flush();
return new Response('saved');
}
}
?>
Результат выполнения кода в колонке user_type:
["user", "admin"]
Смотрите также
-
атрибут
InheritanceType,
который задаёт стратегию наследования сущностей -
атрибут
DiscriminatorMap,
который связывает значения дискриминатора с классами -
атрибут
MappedSuperclass,
который помечает родительский класс без своей таблицы -
атрибут
Entity,
который помечает класс как сущность Doctrine