生成唯一的ID - 理论 - Symfony2的(Generate unique id - do

2019-07-20 09:47发布

我想为我的门票唯一的门票ID。 但是,如何让教义产生一个唯一的ID?

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

多一点解释:

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

Answer 1:

随着2.3版本 ,你可以添加以下注释为您的属性:

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


Answer 2:

使用自定义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 :('); } } } } 


Answer 3:

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

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

作为注释名称建议,将对象持久化到数据库之前运行。

对于唯一的ID,我只需使用一个本地的PHP uniqid()函数http://php.net/manual/en/function.uniqid.php将返回13个字符。 得到的只有6个字符,请参阅本PHP票务ID代

在$ id属性,我想你也需要删除这条线,以防止它自动生成的值:

@ORM\GeneratedValue(strategy="AUTO")


Answer 4:

学说将把这个字段(因为你的主键@Id注释),所以这个领域已经是独一无二的。 如果你有@GeneratedValue上标注AUTO战略学说会弄清楚的数据库平台上使用该策略的依赖性。 它会默认为IDENTITY对MySQL和领域将是一个auto_increment然后。

你可以写的ID注释不如下括号。

  • ORM \标识


Answer 5:

虽然我借调由Jonhathan建议的UUID的方法,你可以喜欢一个更短,更易读,标识。 在这种情况下,你可以使用短ID主义捆绑 。



文章来源: Generate unique id - doctrine - symfony2