ti-enxame.com

Gerar ID exclusivo - doctrine - symfony2

Quero gerar um ID de ticket exclusivo para meus tickets. Mas como deixar doctrine gerar um ID único?

/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

pouco mais explica:

  • o ID deve ter 6 cartas, como: 678915
  • id deve ser único
37
Mitchel Verschoof

A partir de versão 2. , você pode adicionar as seguintes anotações à sua propriedade:

/**
 * @ORM\Column(type="guid")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="UUID")
 */
protected $id;
68
Jonathan

Use a estratégia GeneratedValue personalizada:

1. Na sua classe de entidade:

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class="AppBundle\Doctrine\RandomIdGenerator")
 */
protected $id;

2. Em seguida, crie o arquivo AppBundle/Doctrine/RandomIdGenerator.php com conteúdo

namespace AppBundle\Doctrine;
use Doctrine\ORM\Id\AbstractIdGenerator;

class RandomIdGenerator extends AbstractIdGenerator
{
    public function generate(\Doctrine\ORM\EntityManager $em, $entity)
    {
        $entity_name = $em->getClassMetadata(get_class($entity))->getName();

        // Id must be 6 digits length, so range is 100000 - 999999
        $min_value = 100000;
        $max_value = 999999;

        $max_attempts = $min_value - $max_value;
        $attempt = 0;

        while (true) {
            $id = mt_Rand($min_value, $max_value);
            $item = $em->find($entity_name, $id);

            // Look in scheduled entity insertions (persisted queue list), too
            if (!$item) {
                $persisted = $em->getUnitOfWork()->getScheduledEntityInsertions();
                $ids = array_map(function ($o) { return $o->getId(); }, $persisted);
                $item = array_search($id, $ids);
            }

            if (!$item) {
                return $id;
            }

            // Should we stop?
            $attempt++;
            if ($attempt > $max_attempts) {
                throw new \Exception('RandomIdGenerator worked hardly, but failed to generate unique ID :(');
            }  
        }

    }
}
38
psylosss

Você pode usar a anotação PrePersist, assim:

/**
 * @ORM\PrePersist()
 */
public function preSave() {
    $this->id = uniqid();
}

Como o nome da anotação sugere, ele será executado antes da persistência do objeto no banco de dados.

Para identificação única, eu simplesmente uso uma função nativa do php uniqid () http://php.net/manual/en/function.uniqid.php que retornará 13 caracteres. Para obter apenas 6 caracteres, consulte este PHP Ticket ID Generation

Na propriedade $ id, acho que você também precisa remover esta linha para impedir o valor gerado automaticamente:

@ORM\GeneratedValue(strategy="AUTO")
3
ihsan

Enquanto estou apoiando a abordagem UUID sugerida por Jonhathan, você pode preferir um identificador mais curto e legível. Nesse caso, você pode usar ShortId Doctrine bundle .

1
Massimiliano Arione

A doutrina tratará esse campo como sua chave primária (por causa da @Id anotação), portanto esse campo já é exclusivo. Se você tiver o @GeneratedValue anotação em AUTO strategy Doctrine descobrirá qual estratégia usar depende da plataforma db. O padrão será IDENTITY no MySql e o campo será seja um auto_increment então.

Você pode escrever a anotação de identificação sem os colchetes da seguinte maneira.

  • ORM\Id
1
Bram Gerritsen