37

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

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

再解释一下:

  • id 必须是 6 个包机,例如:678915
  • id 必须是唯一的
4

5 回答 5

73

2.3 版开始,您只需将以下注释添加到您的属性中:

/**
 * @ORM\Column(type="guid")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="UUID")
 */
protected $id;
于 2014-04-19T20:18:52.200 回答
39

使用自定义 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);

            // 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 :(');
            }  
        }

    }
}
于 2015-04-01T21:31:00.777 回答
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")
于 2013-02-24T01:31:31.143 回答
2

Doctrine 会把这个字段当作你的主键(因为@Id注解),所以这个字段已经是唯一的了。如果您@GeneratedValue在策略上有注释,AUTODoctrine 将确定在 db 平台上使用哪种策略。它将默认IDENTITY在 MySql 上,并且该字段将是一个auto_incrementthen。

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

  • ORM\ID
于 2013-02-23T10:57:27.723 回答
1

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

于 2017-02-07T13:06:57.717 回答