2012-07-14 13 views
17

doctrineを使用している間、エンティティを削除するために、指定されたパラメータ(name、idなど)でそのエンティティを取得してからremoveメソッドを呼び出す必要があることに気付きました。一方、クエリでは、私は削除クエリを実行することができます。Doctrineエンティティ削除対削除クエリ、パフォーマンス比較

ORMスタイルを使用すると、2つの操作と1つの操作を必要とする一般的なSQL操作が必要です。そのため、ORMで削除(または更新)操作を使用すべきかどうか、私はちょっと混乱しますか?パフォーマンスは悪くないですか?あるいは、私が紛失しているものは他にありますか?他の方法でORM形式で行うことはできますか?

答えて

38

Doctrine2では、データベースからロードされていないプロキシオブジェクトに対してdeleteを呼び出すことができます。

$user = $em->getPartialReference('model\User', array('id' => $id)); 
$em->remove($user); 

それは、最初のクエリを必要としませんが、私はDoctrineはまだfushに内部的にそれをしないならば、非常にわからない:ただ、のようなものを「ダミー」オブジェクトを作成します。 SqlLogでは表示されません。

これを追加するだけで、これはまともなORMの予想される動作だと思います。物と関係を扱う。削除する前に何かが存在することを知る必要があります。 ORMはクエリジェネレータだけではありません。一般にネイティブクエリは、任意のORMで常に高速になります。どんなORMでも抽象レイヤーが追加され、実行には時間がかかります。これは典型的なトレードオフですが、あなたはいくつかの派手な機能ときれいなコードを手に入れますが、パフォーマンス上はいくらかゆるやかです。

EDIT:

私はそれはあなたのために働いてくれてうれしいです。実際に私は別の問題に遭遇し、プロキシと部分的なオブジェクトが実際に同じものではないことに気付きました。部分オブジェクトは実際のモデルクラスをインスタンス化し、必要な値で埋めます。部分オブジェクトを初期化した後、遅延ロードはもはや機能しません。たとえば、idだけの部分オブジェクトを作成し、別のオブジェクトフィールドがある条件を満たしている場合にのみ削除したい場合、その他のフィールドは常にnullになるため、機能しません。

一方、プロキシはレイジーローディングで動作し、部分的なオブジェクトが持つ問題を共有しません。そうでない場合は

$user = $em->getReference('model\User', $id); 
$em->remove($user); 

getReference方法は、それがすでにロードされている場合は、オブジェクトまたはプロキシを返します。だから私は強く代わりに、あなたのような何かを行うことができ、getPartialReferenceメソッドを使用しないようお勧めします。プロキシは、必要な場合には、他のすべての値を遅延ロードすることができます。あなたの例として、彼らはまったく同じように動作しますが、プロキシは確かに良い方法です。

+1

ありがとうございました情報とclarificaiton – Rana

4

完了! 私のためには、このように3行追加しました:

$user = $em->getReference('model\User', $id); 
$em->remove($user); 
$em->flush();