Поле enum
Поле enum типа EnumType в Doctrine
хранит значение из PHP-перечисления (enum) в
базе данных. Первым параметром в атрибут
Column передаётся тип поля, вторым -
опции, среди которых обязательна опция
enumType, указывающая класс перечисления.
При чтении из базы Doctrine автоматически
преобразует строку или число в объект
перечисления.
Синтаксис
#[Column(type: 'enum', enumType: EnumClass::class, options: [])]
Пример
Давайте создадим перечисление статусов статьи:
<?php
namespace AppEnum;
enum ArticleStatus: string
{
case Draft = 'draft';
case Published = 'published';
case Archived = 'archived';
}
?>
Теперь опишем сущность с полем этого перечисления:
<?php
namespace AppEntity;
use AppEnumArticleStatus;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMColumn(type: 'enum', enumType: ArticleStatus::class)]
private ArticleStatus $status;
public function getStatus(): ArticleStatus
{
return $this->status;
}
public function setStatus(ArticleStatus $status): void
{
$this->status = $status;
}
}
?>
Создадим статью со статусом Published:
<?php
use AppEntityArticle;
use AppEnumArticleStatus;
$article = new Article();
$article->setStatus(ArticleStatus::Published);
echo $article->getStatus()->value;
?>
Результат выполнения кода:
"published"
Пример
Перечисление может быть целочисленным. Давайте создадим enum для приоритета задачи:
<?php
namespace AppEnum;
enum TaskPriority: int
{
case Low = 1;
case Medium = 2;
case High = 3;
}
?>
Опишем сущность с этим полем:
<?php
namespace AppEntity;
use AppEnumTaskPriority;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Task
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
#[ORMColumn(type: 'enum', enumType: TaskPriority::class)]
private TaskPriority $priority;
public function getPriority(): TaskPriority
{
return $this->priority;
}
public function setPriority(TaskPriority $priority): void
{
$this->priority = $priority;
}
}
?>
Создадим задачу с высоким приоритетом:
<?php
use AppEntityTask;
use AppEnumTaskPriority;
$task = new Task();
$task->setPriority(TaskPriority::High);
echo $task->getPriority()->value;
?>
Результат выполнения кода:
3
Пример
Опция nullable позволяет хранить в поле
значение null:
<?php
namespace AppEntity;
use AppEnumArticleStatus;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMColumn(type: 'enum', enumType: ArticleStatus::class, nullable: true)]
private ?ArticleStatus $status = null;
public function getStatus(): ?ArticleStatus
{
return $this->status;
}
public function setStatus(?ArticleStatus $status): void
{
$this->status = $status;
}
}
?>
Создадим статью без статуса:
<?php
use AppEntityArticle;
$article = new Article();
$article->setTitle('abcde');
var_dump($article->getStatus());
?>
Результат выполнения кода:
NULL