РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
118 of 258 menu

Атрибут CustomIdGenerator

Атрибут CustomIdGenerator вешается на свойство сущности, помеченное как Id, и говорит Doctrine использовать пользовательский класс-генератор для получения значения первичного ключа. Первым параметром передаётся имя класса генератора, который реализует интерфейс AbstractIdGenerator. В отличие от GeneratedValue со стратегией CUSTOM, атрибут CustomIdGenerator позволяет задать генератор прямо в сущности без изменения конфигурации.

Синтаксис

#[CustomIdGenerator(class: GeneratorClass::class)]

Пример

Давайте создадим собственный генератор, который возвращает строку формата 'user-' с порядковым номером:

<?php namespace AppDoctrine; use DoctrineORMMapping; use DoctrineORMIdAbstractIdGenerator; class UserIdGenerator extends AbstractIdGenerator { public function generateId( ?MappingClassMetadata $metadata, ?object $entity ): string { return 'user-' . uniqid(); } } ?>

Теперь применим этот генератор в сущности:

<?php namespace AppEntity; use AppDoctrineUserIdGenerator; use DoctrineORMMapping as ORM; #[ORMEntity] class User { #[ORMId] #[ORMColumn(type: 'string', length: 255)] #[ORMCustomIdGenerator(class: UserIdGenerator::class)] private string $id; #[ORMColumn(type: 'string', length: 255)] private string $name; public function getId(): string { return $this->id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } } ?>

После сохранения сущности через EntityManager идентификатор будет сгенерирован автоматически:

<?php namespace AppController; use AppEntityUser; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class UserController extends AbstractController { #[Route('/user', name: 'user_create')] public function create(EntityManagerInterface $em): Response { $user = new User(); $user->setName('abcde'); $em->persist($user); $em->flush(); return new Response($user->getId()); } } ?>

Результат выполнения кода:

"user-65f1a2b3c4d5e"

Пример

Давайте создадим генератор, который возвращает числовое значение на основе текущего времени:

<?php namespace AppDoctrine; use DoctrineORMMapping; use DoctrineORMIdAbstractIdGenerator; class TimestampIdGenerator extends AbstractIdGenerator { public function generateId( ?MappingClassMetadata $metadata, ?object $entity ): int { return time(); } } ?>

Применим генератор к сущности Article:

<?php namespace AppEntity; use AppDoctrineTimestampIdGenerator; use DoctrineORMMapping as ORM; #[ORMEntity] class Article { #[ORMId] #[ORMColumn(type: 'integer')] #[ORMCustomIdGenerator(class: TimestampIdGenerator::class)] private int $id; #[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): void { $this->title = $title; } } ?>

После сохранения сущности идентификатор будет равен метке времени создания:

<?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('hello'); $em->persist($article); $em->flush(); return new Response((string) $article->getId()); } } ?>

Результат выполнения кода:

"1742385600"

Смотрите также

  • атрибут Id,
    который помечает свойство как первичный ключ
  • атрибут GeneratedValue,
    который задаёт стратегию генерации значения
  • атрибут SequenceGenerator,
    который настраивает генерацию через последовательность
  • атрибут Entity,
    который помечает класс как сущность Doctrine
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить