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には、 13文字を返すネイティブのphp uniqid()関数http://php.net/manual/en/function.uniqid.phpを使用します。6文字のみを取得するには、このPHPチケットIDの生成を参照してください

$ 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アプローチを支持している間、より短く、より読みやすい識別子を好むかもしれません。この場合、ShortIdDoctrineバンドルを使用できます。

于 2017-02-07T13:06:57.717 に答える