永続化/フラッシュする前にエンティティIDを取得する方法はありますか?というのは:
$entity = new PointData();
$form = $this->createForm(new PointDataType(), $entity);
この時点で$ entity-> getId()を試してみると、何も返されません。
私はそれを機能させることができます:
$em->persist($entity);
$em->flush();
(仮定$ em = $ this-> getDoctrine()-> getEntityManager();)
どうすればこれを達成できますか?
データベースに永続化される前にエンティティのIDを知りたい場合は、生成された識別子を使用できないことは明らかです。一意の識別子を自分で生成する方法を見つける必要があります(おそらく、ある種のハッシュ関数で十分な一意の値を生成できます)。
ただし、これが良い考えになることはめったにないので、注意する必要があります。
フラッシュする前に識別子を知る必要がある理由について、非常に慎重に考えます。 Doctrineは、大きなオブジェクトグラフを作成し、それを一度に永続化/フラッシュするのに非常に優れています。あなたが試しているアーキテクチャに醜いものがあるようです。アプリケーションで生成されたIDルートをたどる前に、それを確認することをお勧めします。
@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.
}
...
}
自動生成された識別子は避けてください。理由:
- DB操作は互いにブロックします
- バルクインサートを拒否しています
- マルチリクエスト取引はできません
- 保存するまでオブジェクトは無効です
- オブジェクトはDBなしでは機能しません
したがって、代わりに[〜#〜] uuids [〜#〜]を使用できます
public function __construct() {
$this->id = Uuid::uuid4();
}
また、Doctrineは [〜#〜] uuid [〜#〜] バージョン2.3以降の生成戦略をサポートしています。
$em = $this->getDoctrine()->getManager();
$entity = new PointData();
$em->persist($entity);
$entity->getId() <-- return <int>
$em->flush();
自動生成IDを使用して、ユニバーサル一意識別子(UUID)などのキーを取得するか、symfonyのイベントを取得できます。postFlush-postFlushイベントは、フラッシュ操作の最後に発生します。