Generating next sequence value manually in Doctrine 2
Then I think you should implement your own Identitfer Generator.
The easyest would be to override the Doctrine\ORM\Id\SequenceGenerator class to handle your specific case.
You then have to register this generator in the class metadata using Doctrine ORM API.
Some links: 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
Just in case someone else lands on this question (like I did):
The pull request @Florian mentioned made it into doctrine now. Although documentation seems to still lack any information for the CUSTOM id generator strategy. Only part I found where CUSTOM
option for IdGenerator is mentioned is at GeneratedValue description. If I missed it, please correct me in the comments.
Tough it can easily be implemented. Just create an class extending Doctrine\ORM\Id\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;
}
}
Then add it to your id
description in the doctrine entity configuration (YAML
example):
My\Bundle\Entity\MyEntity:
type: entity
id:
id:
type: bigint
unique: true
generator:
strategy: CUSTOM
customIdGenerator:
class: 'My\Namespace\MyIdGenerator'
fields:
otherField: ....
If you use Annotations
instead of YAML, the entity configuration should look like this (untested):
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="CUSTOM")
* @CustomIdGenerator(class="My\Namespace\MyIdGenerator")
*/
public $id;
And thats all ;)
There are two possibilities getting sequence nextval in Doctrine2:
Use 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
Use native 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);