生成唯一的id-symfony2



我想为我的票证生成一个唯一的票证ID。但是,如何让教义产生一个独特的本我呢?

/**
 * @ORMColumn(name="id", type="integer")
 * @ORMId()
 * @ORMGeneratedValue(strategy="AUTO")
 */
protected $id;

更多解释:

  • id必须是6个租船合同,如:678915
  • id必须是唯一的

从版本2.3开始,您只需向属性添加以下注释:

/**
 * @ORMColumn(type="guid")
 * @ORMId
 * @ORMGeneratedValue(strategy="UUID")
 */
protected $id;

使用自定义GeneratedValue策略:

1.在实体类中:

/**
 * @ORMId
 * @ORMColumn(type="integer")
 * @ORMGeneratedValue(strategy="CUSTOM")
 * @ORMCustomIdGenerator(class="AppBundleDoctrineRandomIdGenerator")
 */
protected $id;

2.然后创建包含内容的文件AppBundle/Doctrine/RandomIdGenerator.php

namespace AppBundleDoctrine;
use DoctrineORMIdAbstractIdGenerator;
class RandomIdGenerator extends AbstractIdGenerator
{
    public function generate(DoctrineORMEntityManager $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 :(');
            }  
        }
    }
}

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

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

正如注释名称所暗示的,它将在对象持久化到数据库之前运行。

对于唯一id,我只需使用一个本地php-uniqid()函数http://php.net/manual/en/function.uniqid.php它将返回13个字符。要只获得6个字符,请参阅此PHP票证ID生成

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

@ORMGeneratedValue(strategy="AUTO")

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

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

  • ORM\Id

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

最新更新