Атрибут MappedSuperclass
Атрибут MappedSuperclass вешается на класс,
который не является сущностью, но содержит общие
поля и методы для других сущностей. Дочерние классы
наследуют эти поля, и они становятся частью их
таблиц в базе данных. Сам родительский класс
не может быть сущностью и не имеет своей таблицы.
Синтаксис
#[MappedSuperclass]
class ClassName
{
// common fields and methods
}
Пример
Давайте создадим родительский класс с общими полями
id, createdAt и updatedAt:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\MappedSuperclass]
abstract class BaseEntity
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
protected int $id;
#[ORM\Column(type: 'datetime')]
protected DateTimeInterface $createdAt;
#[ORM\Column(type: 'datetime', nullable: true)]
protected ?DateTimeInterface $updatedAt = null;
public function getId(): int
{
return $this->id;
}
public function getCreatedAt(): DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
}
?>
Теперь создадим сущность Article, которая
наследует поля от BaseEntity:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'articles')]
class Article extends BaseEntity
{
#[ORM\Column(type: 'string', length: 255)]
private string $title;
#[ORM\Column(type: 'text')]
private string $content;
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getContent(): string
{
return $this->content;
}
public function setContent(string $content): self
{
$this->content = $content;
return $this;
}
}
?>
Пример
Давайте создадим ещё одну сущность User,
которая также наследует BaseEntity:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'users')]
class User extends BaseEntity
{
#[ORM\Column(type: 'string', length: 255)]
private string $name;
#[ORM\Column(type: 'boolean')]
private bool $active = true;
public function getName(): string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function isActive(): bool
{
return $this->active;
}
public function setActive(bool $active): self
{
$this->active = $active;
return $this;
}
}
?>
Пример
Давайте сохраним сущность Article
в базу данных и выведем её поля:
<?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('abcde');
$article->setContent('hello');
$article->setCreatedAt(new DateTime());
$em->persist($article);
$em->flush();
return new Response(
'ID: ' . $article->getId() . ', '
. 'Title: ' . $article->getTitle()
);
}
}
?>
Результат выполнения кода:
"ID: 1, Title: abcde"
Смотрите также
-
атрибут
Entity,
который помечает класс как сущность -
атрибут
InheritanceType,
который задаёт стратегию наследования сущностей -
атрибут
AttributeOverride,
который переопределяет параметры поля родителя -
атрибут
AssociationOverride,
который переопределяет связи родительского класса