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