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