Атрибут AttributeOverride
Атрибут AttributeOverride используется
вместе с атрибутом AttributeOverrides
и вешается на класс сущности-наследника. Он
переопределяет параметры поля, унаследованного
от родительской сущности или от MappedSuperclass.
Первым параметром передаётся имя поля, а
именованными параметрами задаются новые
настройки: name, type, length,
nullable, unique, column и другие.
Синтаксис
#[AttributeOverride(name: field, column: new Column(name: 'column_name'))]
Пример
Давайте создадим родительскую сущность с полем
title и переопределим имя колонки в
сущности-наследнике:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\MappedSuperclass]
class BaseArticle
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
protected ?int $id = null;
#[ORM\Column(type: 'string', length: 255)]
protected string $title = '';
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
}
?>
Теперь создадим наследника и переопределим
поле title:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\Entity]
#[ORM\AttributeOverrides([
new ORM\AttributeOverride(
name: 'title',
column: new ORM\Column(name: 'article_title', type: 'text')
)
])]
class Article extends BaseArticle
{
}
?>
В итоге поле title будет храниться в
колонке article_title с типом text.
Пример
Давайте переопределим сразу несколько полей у сущности-наследника:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\MappedSuperclass]
class BaseUser
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
protected ?int $id = null;
#[ORM\Column(type: 'string', length: 255)]
protected string $name = '';
#[ORM\Column(type: 'string', length: 255, unique: true)]
protected string $email = '';
}
?>
Переопределим оба поля в наследнике:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORM\Entity]
#[ORM\AttributeOverrides([
new ORM\AttributeOverride(
name: 'name',
column: new ORM\Column(name: 'admin_name', type: 'string', length: 100)
),
new ORM\AttributeOverride(
name: 'email',
column: new ORM\Column(name: 'admin_email', type: 'string', length: 180, unique: false)
)
])]
class Admin extends BaseUser
{
}
?>
Результат выполнения кода - колонки
admin_name и admin_email в таблице
сущности Admin:
["admin_name", "admin_email"]
Смотрите также
-
атрибут
AssociationOverride,
который переопределяет связи сущности -
атрибут
MappedSuperclass,
который задаёт родительский класс для наследования -
атрибут
Entity,
который помечает класс как сущность Doctrine -
атрибут
Table,
который задаёт имя таблицы для сущности