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

Атрибут InheritanceType

Атрибут InheritanceType вешается на класс сущности и задаёт стратегию наследования для иерархии сущностей. Первым параметром передаётся тип наследования: 'SINGLE_TABLE', 'JOINED' или 'TABLE_PER_CLASS'. Стратегия 'SINGLE_TABLE' хранит все классы иерархии в одной таблице, 'JOINED' создаёт отдельную таблицу для каждого класса, а 'TABLE_PER_CLASS' создаёт таблицу для каждого конкретного класса.

Синтаксис

#[InheritanceType(type)]

Пример

Давайте создадим иерархию сущностей со стратегией 'SINGLE_TABLE'. Сначала создадим базовую сущность Content:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORMEntity] #[ORMInheritanceType('SINGLE_TABLE')] #[ORMDiscriminatorColumn(name: 'type', type: 'string')] #[ORMDiscriminatorMap(['content' => Content::class, 'article' => Article::class])] class Content { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string', length: 255)] private ?string $title = null; public function getId(): ?int { return $this->id; } public function getTitle(): ?string { return $this->title; } public function setTitle(string $title): self { $this->title = $title; return $this; } } ?>

Теперь создадим наследника Article:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORMEntity] class Article extends Content { #[ORMColumn(type: 'text')] private ?string $body = null; public function getBody(): ?string { return $this->body; } public function setBody(string $body): self { $this->body = $body; return $this; } } ?>

Пример

Давайте используем стратегию 'JOINED', при которой каждый класс получает собственную таблицу:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORMEntity] #[ORMInheritanceType('JOINED')] #[ORMDiscriminatorColumn(name: 'type', type: 'string')] #[ORMDiscriminatorMap(['content' => Content::class, 'article' => Article::class])] class Content { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string', length: 255)] private ?string $title = null; public function getId(): ?int { return $this->id; } public function getTitle(): ?string { return $this->title; } public function setTitle(string $title): self { $this->title = $title; return $this; } } ?>

Теперь создадим наследника Article с собственной таблицей:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORMEntity] #[ORMTable(name: 'article')] class Article extends Content { #[ORMColumn(type: 'text')] private ?string $body = null; public function getBody(): ?string { return $this->body; } public function setBody(string $body): self { $this->body = $body; return $this; } } ?>

Пример

Давайте сохраним сущность Article через EntityManager и выведем её заголовок:

<?php namespace AppController; use AppEntityArticle; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article', name: 'article_create')] public function create(EntityManagerInterface $em): Response { $article = new Article(); $article->setTitle('hello'); $article->setBody('abcde'); $em->persist($article); $em->flush(); return new Response($article->getTitle()); } } ?>

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

hello

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

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