Атрибут GeneratedValue
Атрибут GeneratedValue вешается на свойство сущности,
которое помечено атрибутом Id. Он сообщает Doctrine,
что значение этого поля не нужно задавать вручную - оно будет
сгенерировано автоматически при сохранении сущности. Первым
параметром передаётся стратегия генерации: AUTO,
IDENTITY, SEQUENCE, UUID или CUSTOM.
Стратегия AUTO позволяет Doctrine самостоятельно выбрать
способ генерации в зависимости от драйвера базы данных.
Стратегия IDENTITY полагается на автоинкремент самой СУБД.
Стратегия SEQUENCE использует отдельную последовательность,
а UUID генерирует уникальный идентификатор на стороне PHP.
Синтаксис
#[GeneratedValue(strategy: strategy)]
Пример
Давайте создадим сущность Article с автоинкрементным
идентификатором:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue(strategy: 'IDENTITY')]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
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;
}
}
?>
Теперь сохраним новую статью через EntityManager:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('abcde');
$em->persist($article);
$em->flush();
return new Response((string) $article->getId());
}
}
?>
Результат выполнения кода:
"1"
Пример
Давайте используем стратегию UUID для генерации
идентификатора:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use SymfonyBridgeDoctrineAttributeUuid;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue(strategy: 'UUID')]
#[ORMColumn(type: 'uuid', unique: true)]
private ?string $id = null;
#[ORMColumn(type: 'text')]
private string $body;
public function getId(): ?string
{
return $this->id;
}
public function getBody(): string
{
return $this->body;
}
public function setBody(string $body): self
{
$this->body = $body;
return $this;
}
}
?>
После сохранения сущности поле id получит
сгенерированное значение UUID:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setBody('abcde');
$em->persist($article);
$em->flush();
return new Response($article->getId());
}
}
?>
Результат выполнения кода:
"550e8400-e29b-41d4-a716-446655440000"
Пример
Давайте применим стратегию SEQUENCE совместно
с атрибутом SequenceGenerator:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue(strategy: 'SEQUENCE')]
#[ORMSequenceGenerator(sequenceName: 'article_seq', allocationSize: 100)]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'boolean')]
private bool $published = false;
public function getId(): ?int
{
return $this->id;
}
public function isPublished(): bool
{
return $this->published;
}
public function setPublished(bool $published): self
{
$this->published = $published;
return $this;
}
}
?>
При сохранении значение id будет взято из
последовательности article_seq:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setPublished(true);
$em->persist($article);
$em->flush();
return new Response((string) $article->getId());
}
}
?>
Результат выполнения кода:
"1"
Смотрите также
-
атрибут
Id,
который помечает поле первичного ключа -
атрибут
SequenceGenerator,
который задаёт параметры последовательности -
атрибут
Entity,
который помечает класс как сущность Doctrine -
атрибут
Column,
который описывает колонку таблицы