Параметр enumType атрибута Column
Параметр enumType атрибута Column
указывает, с каким PHP-перечислением (enum)
связано поле сущности. Он используется вместе
с типом Types::STRING (или другим подходящим
типом) и позволяет Doctrine автоматически
преобразовывать значение колонки в экземпляр
enum и обратно при чтении и записи.
Параметр принимает имя класса перечисления,
реализующего интерфейс BackedEnum
(например, string или int).
Без этого параметра Doctrine не сможет
сопоставить значение из базы с нужным enum.
Синтаксис
#[Column(type: Types::STRING, enumType: SomeEnum::class)]
Пример
Давайте создадим перечисление статусов статьи и свяжем его с полем сущности:
<?php
namespace AppEnum;
enum ArticleStatus: string
{
case Draft = 'draft';
case Published = 'published';
case Archived = 'archived';
}
?>
Теперь опишем сущность с полем статуса:
<?php
namespace AppEntity;
use AppEnumArticleStatus;
use AppRepositoryArticleRepository;
use DoctrineDBALTypesTypes;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: Types::INTEGER)]
private ?int $id = null;
#[ORMColumn(type: Types::STRING, length: 255)]
private ?string $title = null;
#[ORMColumn(type: Types::STRING, length: 20, enumType: ArticleStatus::class)]
private ?ArticleStatus $status = 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;
}
public function getStatus(): ?ArticleStatus
{
return $this->status;
}
public function setStatus(ArticleStatus $status): self
{
$this->status = $status;
return $this;
}
}
?>
Пример
Давайте запишем статью со статусом и выведем значение поля:
<?php
namespace AppController;
use AppEntityArticle;
use AppEnumArticleStatus;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('abcde');
$article->setStatus(ArticleStatus::Published);
$em->persist($article);
$em->flush();
return new Response($article->getStatus()->value);
}
}
?>
Результат выполнения кода:
"published"
Пример
Давайте найдём статью и получим экземпляр enum
из поля status:
<?php
namespace AppController;
use AppEntityArticle;
use AppEnumArticleStatus;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function show(EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find(1);
return new Response($article->getStatus()->name);
}
}
?>
Результат выполнения кода:
"Published"