3

Orderオブジェクトが多くのステップを経て構築される注文プロセスを構築しています。各ステップの後、部分的に完成Orderしたオブジェクトをに入れsession、最後のステップでそれをデータベースに保存します。

手順中に、他の (既に存在する) 関連オブジェクトを自分のOrderオブジェクト (例: ) に読み込みますDiscountCoupon。問題は、に保存Ordersessionて次のステップでロードすると、関連付けられているすべてのエンティティが切り離されることです。そのため、データベースに保存しようとすると、例外がスローされ、リレーションシップにEntityManagera を設定するよう求められます。cascade=persist

もちろん、これらのオブジェクトを永続化する必要はありません (それらは既にデータベースに存在します)。明白な解決策は、これらの関連付けられたオブジェクトを (メソッドを使用して) マージされたものに変更することですがEntityManager#merge、複数のレベルのエンティティが埋め込まれたかなり複雑なオブジェクト構造を持っているため、上記のプロセスを実行するのはかなり不便です。

Doctrine は自動的にこのタスクを実行できませんか? したがって、切り離されたエンティティについて「不平を言う」代わりに、それらを自動的にマージできます。

4

1 に答える 1

0

私の知る限り、完全に自動化しようとすると、深刻な魔法を作成することになります.

あなたの最善の策は、おそらく次のような署名を持つ関数を実装することです: Order 構造を話し、切り離されたすべての関連付けられたエンティティで EntityManager::merge() を呼び出す方法を知っている mergeOrderEntities($Order, $EntityManager) 。

doctrine がこれを自動的に行わない理由については、よくわかりません。エンティティの自動マージが危険であるか、少なくとも望ましくないユースケースがあると思います。

于 2012-05-24T15:23:30.653 に答える