Создание следующего значения последовательности вручную в Doctrine 2

Каким будет самый простой способ генерировать nextval для некоторой определенной последовательности с заданным именем?

Решение аннотации с указанием

  * @ORM\GeneratedValue(strategy="SEQUENCE") * @ORM\SequenceGenerator(sequenceName="sq_foobar", allocationSize="1", initialValue="1") 

не удовлетворяет меня, пока существует более сложная логика: в некоторых случаях мне нужно получить nextval , в другом – я бы пошел со значением, полученным из других источников (а не для последовательности).

Поэтому я надеюсь, что есть способ получить последовательность nextval вручную в конструкторе сущности.

Related of "Создание следующего значения последовательности вручную в Doctrine 2"

Тогда я думаю, что вы должны реализовать свой собственный генератор идентификаторов.

Самый простой способ – переопределить класс Doctrine \ ORM \ Id \ SequenceGenerator для обработки вашего конкретного случая.

Затем вам необходимо зарегистрировать этот генератор в метаданных класса с помощью Doctrine ORM API.

Некоторые ссылки: http://ranskills.wordpress.com/2011/05/26/how-to-add-a-custom-id-generation-strategy-to-doctrine-2-1/

https://github.com/doctrine/doctrine2/pull/206

На всякий случай, если кто-то другой возьмет на себя этот вопрос (как и я):
Запрос на растяжение @Florian, упомянутый, превратил его в доктрину. Хотя документация, похоже, по-прежнему не содержит никакой информации для стратегии генератора идентификаторов CUSTOM . Только часть, которую я нашел, где указан параметр CUSTOM для IdGenerator, приведен в описании GeneratedValue . Если я пропустил это, пожалуйста, исправьте меня в комментариях.

Жесткий он может быть легко реализован. Просто создайте класс, расширяющий Doctrine\ORM\Id\AbstractIdGenerator\AbstractIdGenerator :

 namespace My\Namespace; use Doctrine\ORM\Id\AbstractIdGenerator; class MyIdGenerator extends AbstractIdGenerator { public function generate(\Doctrine\ORM\EntityManager $em, $entity) { // Create id here $id = <do some logic>; return $id; } } 

Затем добавьте его в свое описание id в конфигурации сущности доктрины (пример YAML ):

 My\Bundle\Entity\MyEntity: type: entity id: id: type: bigint unique: true generator: strategy: CUSTOM customIdGenerator: class: 'My\Namespace\MyIdGenerator' fields: otherField: .... 

Если вы используете Annotations вместо YAML, конфигурация объекта должна выглядеть так (непроверенная):

 /** * @Id * @Column(type="integer") * @GeneratedValue(strategy="CUSTOM") * @CustomIdGenerator(class="My\Namespace\MyIdGenerator") */ public $id; 

И это все 😉

Есть две возможности получить последовательность nextval в Doctrine2:

  1. Использовать Doctrine ORM SequenceGenerator

     use Doctrine\ORM\Id\SequenceGenerator; $sequenceName = 'file_id_seq'; $sequenceGenerator = new SequenceGenerator($sequenceName, 1); $newId = $sequenceGenerator->generate($entityManager, $entity); // $entity in this case is actually not used in generate() method, so you can give any empty object, or if you are not worried about editor/IDE warnings, you can also specify null 
  2. Использовать собственный SQL-код

     $sequenceName = 'file_id_seq'; $dbConnection = $entityManager->getConnection(); $nextvalQuery = $dbConnection->getDatabasePlatform()->getSequenceNextValSQL($sequenceName); // $nextvalQuery is now following string "SELECT NEXTVAL('file_id_seq')" $newId = (int)$dbConnection->fetchColumn($nextvalQuery);