エンティティのコレクション (つまり、リレーショナル専門用語ではテーブル) をクリーンアップしようとしています。これらのエンティティは のインスタンスでありColor
、Doctrine 2 を使用してすべての参照されていない を削除するスクリプトを実行したいと考えていますColor
。問題はColor
、システム内の他の多くのエンティティによって参照されることです。したがって、次の 2 つの選択肢が考えられます。
- すべての色を繰り返し
Color
、システム上の他のエンティティの特定への参照が存在するかどうかを手動で確認し、参照がない場合は削除します。 - すべての色を反復処理して 1 つを削除しようとします。その色への参照がある場合は、整合性制約違反が原因で EM によって発生した例外をキャッチします。そのため、失敗した色を無視して次へ進みます。
明らかに、2 番目の選択肢は最初の選択肢よりも単純なので、それを試してみました。私が抱えていた問題は、エンティティの削除が失敗した場合、EM が例外をスローするだけでなく、エンティティ マネージャーを閉じると、それを使用して残りの色を削除できなくなることです!
Doctrine 2 でクラスのcommit
メソッドをチェックすると、実際には...UnitOfWork
try {
... //Execute queries
$conn->commit();
} catch (Exception $e) {
$this->em->close();
$conn->rollback();
throw $e;
}
私がやろうとしていることを達成する方法はありますか (おそらく Entity Manager を再度開く)?
もっと良い方法があると思いますか?
Doctrine がこの動作をするのはなぜですか?
また、Symfony 2 で Doctrine 2 を使用していることにも注意してください。