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

Атрибут 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить