Doctrine2では、データベースからロードされていないプロキシオブジェクトでdeleteを呼び出すことができます。次のような「ダミー」オブジェクトを作成するだけです。
$user = $em->getPartialReference('model\User', array('id' => $id));
$em->remove($user);
最初のクエリは必要ありませんが、Doctrineがフラッシュ時に内部的にクエリを実行するかどうかはよくわかりません。SqlLogに表示されません。
付け加えると、これはまともなORMの予想される動作だと思います。オブジェクトと関係を扱います。削除する前に、何かが存在することを知っている必要があります。ORMは単なるクエリジェネレータではありません。一般に、ネイティブクエリはどのORMでも常に高速になります。ORMは抽象化レイヤーを追加し、実行には時間がかかります。これは典型的なトレードオフであり、いくつかの優れた機能とクリーンなコードを取得できますが、パフォーマンスが低下します。
編集:
それがあなたのためにうまくいったことをうれしく思います。実際、私は別の問題に遭遇しました。その結果、プロキシと部分オブジェクトは実際には同じものではないことに気づきました。部分オブジェクトは実際のモデルクラスをインスタンス化し、必要な値で埋めます。部分オブジェクトを初期化すると、遅延読み込みは機能しなくなります。したがって、たとえば、IDのみで部分オブジェクトを作成し、別のオブジェクトフィールドが何らかの条件を満たす場合にのみ削除したい場合、他のフィールドは常にnullになるため、機能しません。
一方、プロキシは遅延読み込みで機能し、部分的なオブジェクトが抱える問題を共有しません。したがってgetPartialReference
、メソッドを使用しないことを強くお勧めします。代わりに、次のようなことを行うことができます。
$user = $em->getReference('model\User', $id);
$em->remove($user);
このgetReference
メソッドは、オブジェクトがすでにロードされている場合はオブジェクトを返し、ロードされていない場合はプロキシを返します。プロキシは、必要に応じて、他のすべての値を遅延ロードできます。あなたの例に関しては、それらはまったく同じように動作しますが、プロキシは確かにより良い方法です。