生成唯一的id - doctrine - symfony2

时间:2013-02-23 10:50:22

标签: symfony doctrine

我想为我的门票生成唯一的门票ID。但是如何让学说产生一个独特的身份?

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

再解释一下:

  • id必须是6个章程,如:678915
  • id必须是唯一的

5 个答案:

答案 0 :(得分:67)

version 2.3开始,您只需将以下注释添加到您的媒体资源中即可:

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

答案 1 :(得分:37)

使用自定义GeneratedValue策略:

1。在您的实体类中:

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

2. 然后使用内容

创建文件AppBundle/Doctrine/RandomIdGenerator.php

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

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

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

    }
}

答案 2 :(得分:3)

您可以使用PrePersist注释,如下所示:

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

正如注释名称所示,它将在对象持久性进入数据库之前运行。

对于唯一ID,我只使用本机php uniqid()函数http://php.net/manual/en/function.uniqid.php,它将返回13个字符。要获得仅6个字符,请参阅此PHP Ticket ID Generation

在$ id属性中,我认为您还需要删除此行以防止自动生成它的值:

@ORM\GeneratedValue(strategy="AUTO")

答案 3 :(得分:1)

Doctrine会将此字段视为您的主键(因为@Id注释),因此该字段已经是唯一的。如果@GeneratedValue策略上有AUTO注释,则Doctrine将确定在db平台上使用哪种策略依赖。在MySql上默认为IDENTITY,然后该字段为auto_increment

您可以编写不带括号的id注释,如下所示。

  • ORM \编号

答案 4 :(得分:1)

虽然我正在考虑Jonhathan建议的UUID方法,但您可能更喜欢更短,更易读的标识符。在这种情况下,您可以使用ShortId Doctrine bundle