Каким будет самый простой способ генерировать nextval
для некоторой определенной последовательности с заданным именем?
Решение аннотации с указанием
* @ORM\GeneratedValue(strategy="SEQUENCE") * @ORM\SequenceGenerator(sequenceName="sq_foobar", allocationSize="1", initialValue="1")
не удовлетворяет меня, пока существует более сложная логика: в некоторых случаях мне нужно получить nextval
, в другом – я бы пошел со значением, полученным из других источников (а не для последовательности).
Поэтому я надеюсь, что есть способ получить последовательность nextval вручную в конструкторе сущности.
Тогда я думаю, что вы должны реализовать свой собственный генератор идентификаторов.
Самый простой способ – переопределить класс 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/
На всякий случай, если кто-то другой возьмет на себя этот вопрос (как и я):
Запрос на растяжение @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:
Использовать 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);