Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Затем вам необходимо зарегистрировать этот генератор в метаданных класса, используя API-интерфейс Doctrine ORM.

Некоторые ссылки: 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

Ответ 2

На всякий случай кто-то другой на этот вопрос нападает (как и я):
Запрос на растяжение @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;

И все это;)

Ответ 3

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

  • Использование 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
    
  • Использовать собственный 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);