19

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

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

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

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

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

$ em = $ this-> getDoctrine()-> getEntityManager();と仮定します)

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

4

6 に答える 6

33

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

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

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

于 2012-05-08T20:48:39.087 に答える
1
$em = $this->getDoctrine()->getManager();
$entity = new PointData();

$em->persist($entity);

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

$em->flush();

永続化した後、IDを取得できます

于 2020-02-08T17:50:40.450 に答える
0

自動生成 ID を使用して Universally Unique Identifier (UUID) のようなキーを取得するか、symfony のイベントを取得できます。 postFlush - postFlush イベントは、フラッシュ操作の最後に発生します。

于 2018-09-06T16:01:26.670 に答える
0

フラッシュする前に ID が必要な理由はわかりませんが、データベースに保存せずにエンティティを永続化する必要がある場合は、Transactionsを使用してみてください。

次のようなことを試してください:

$em->beginTransaction();
$em->persist($entity);
$em->flush();
$id = $entity->getId();
//do some stuff and save when ready
$em->commit();
于 2021-04-28T08:19:57.763 に答える