Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating next sequence value manually in Doctrine 2

What would be the easiest way to generate nextval for some particular sequence with given name?

The annotation solution with specifying

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

doesn't satisfy me, as long as there is some more complex logic involved: in some cases I need to retrieve nextval, in other - I would go with the value retrieved from another sources (not sequence).

So I hope there is a way to retrieve a sequence nextval manually in entity's constructor.

like image 738
zerkms Avatar asked Jan 31 '12 21:01

zerkms


1 Answers

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 ;)

like image 150
enricog Avatar answered Oct 26 '22 14:10

enricog