web-dev-qa-db-ja.com

Doctrine2-フラッシュする前にエンティティIDを取得する

永続化/フラッシュする前にエンティティIDを取得する方法はありますか?というのは:

$entity = new PointData();
$form   = $this->createForm(new PointDataType(), $entity);

この時点で$ entity-> getId()を試してみると、何も返されません。

私はそれを機能させることができます:

$em->persist($entity);
$em->flush();

(仮定$ em = $ this-> getDoctrine()-> getEntityManager();

どうすればこれを達成できますか?

16
Xavi

データベースに永続化される前にエンティティのIDを知りたい場合は、生成された識別子を使用できないことは明らかです。一意の識別子を自分で生成する方法を見つける必要があります(おそらく、ある種のハッシュ関数で十分な一意の値を生成できます)。

ただし、これが良い考えになることはめったにないので、注意する必要があります。

フラッシュする前に識別子を知る必要がある理由について、非常に慎重に考えます。 Doctrineは、大きなオブジェクトグラフを作成し、それを一度に永続化/フラッシュするのに非常に優れています。あなたが試しているアーキテクチャに醜いものがあるようです。アプリケーションで生成されたIDルートをたどる前に、それを確認することをお勧めします。

30
timdev

@PostPersistアノテーションを使用できます。それで注釈が付けられたメソッドは、フラッシュが終了する直前に実行され、エンティティIDはすでに使用可能です。

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html

postPersist-エンティティが永続化された後、postPersistイベントがエンティティに対して発生します。これは、データベースの挿入操作の後に呼び出されます。生成された主キー値は、postPersistイベントで使用できます。

<?php

use Doctrine\ORM\Mapping as ORM;

/** 
 * @ORM\Entity 
 * @ORM\HasLifecycleCallbacks 
 */
class PointData
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $id;

     ...

     /** 
      * @ORM\PostPersist 
      */
     public function onPostPersist()
     {
         // Put some simple logic here that required the auto-generated Id.
     }

     ...

}
10
Elier

Doctrineのベストプラクティス は、

自動生成された識別子は避けてください。理由:

  • DB操作は互いにブロックします
  • バルクインサートを拒否しています
  • マルチリクエスト取引はできません
  • 保存するまでオブジェクトは無効です
  • オブジェクトはDBなしでは機能しません

したがって、代わりに[〜#〜] uuids [〜#〜]を使用できます

public function __construct() {
     $this->id = Uuid::uuid4();  
}

また、Doctrineは [〜#〜] uuid [〜#〜] バージョン2.3以降の生成戦略をサポートしています。

0
$em = $this->getDoctrine()->getManager();
$entity = new PointData();
$em->persist($entity);

$entity->getId() <-- return <int>

$em->flush();
0
ProMix

自動生成IDを使用して、ユニバーサル一意識別子(UUID)などのキーを取得するか、symfonyのイベントを取得できます。postFlush-postFlushイベントは、フラッシュ操作の最後に発生します。

0
achraf akrouti