2009-09-24 7 views
6

私はすべてのモデルにdoctrineのソフトデリート動作を添付しています。特定のレコードを削除する方法はありますか?Symfony/Doctrineで動作を切り離すにはどうすればいいですか?

cakephpで私は振る舞いを切り離してしまったことを覚えています...レコードを削除してから振る舞いを付け直してください。

symfony/doctrineに類似したものはありますか?もしそうなら、どのように行動を切り離すのですか?

乾杯

答えて

9

は私がゼッドの道のために、完全を期すために行くと思う

if (! $query->contains($field)) { 
    // do the magic stuff to covert the query to respect softdelete 
} 

これがあれば、あなたことを意味明示的にフィールドをクエリに記述すると、クエリに変換は適用されません。

だから、あなたがしなければ:

$q = Doctrine_Query::create() 
->delete('Table t') 
->where('t.id = ? AND t.deleted != 2 ', 1); 

それはソフト削除のものを適用しないであろうと、実際にレコードを削除します。 t.deletedで何かできることに注意してください、私はちょうど真実である何かをしました。エイリアス( 't。')も重要です。

このトリックはあまりにも選択肢のために働いています。これは以前私が通常使っていた場所です。私も言うように

、私はその立派にやって思う:

$old_dqlc = Doctrine_Manager::getInstance()->getAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS); 
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false); 
$record->delete(); 
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, $old_dqlc); 

は特に、あなたはまだ手動でクエリを作成するのではなくdelete()メソッドを使用することができます。クエリメソッドのもう一つの利点は、レコードに他のビヘイビアが添付されている場合でも、それが引き続き尊重されることです。

+1

おそらく、Doctrine :: ATTR_USE_DQL_CALLBACKSの前の値をfalseとtrueに設定するのではなく、格納しておくべきでしょう。そのコードに遭遇する前にCALLBACKSがオフになっていたら? –

+0

はい...私は...編集すべきです。 – benlumley

+0

(コールバックがオフの場合、ソフト削除は機能しません) – benlumley

1

これを呼び出すと、動作の処理が無効になります。

汚れた方法として、テーブルからエントリを削除するSQLクエリを生成できます。

+0

nah ..汚れていると思います!!とにかくありがたいです。 – Yashvit

+0

OKです。私が追加したコールを試してみてください。それを試していないが、私はそれが動作するはずだと思う。 – Zed

+0

クール..それは行くだろう... – Yashvit

1

link text私はこの機能と設定を使用すると、マネージャーのように誤ってトリック:)を行う必要があると思うでしょう。ソフト削除の動作については、削除のためのイベントリスナーメソッド

(および選択)含まれています:

13

うーんは... SoftDelete behaviorだけで最善の方法を用いることであろうというヨシュアCoadyに同意したかった

$record->hardDelete(); 
+0

はい - これは私の考えより先に受け入れられることをお勧めします。私は以来これを使用し始めました。 – benlumley

1

呼び出す...これを行うための多くのより洗練された方法が含ま

$record->hardDelete() 

しかし、私がここで追加したかったのは、doctrineの振る舞いを分離するためのGoogleの最初の結果の1つで、「選択」の振る舞いを切り離す最も簡単な方法は、単に「deleted_at」(またはあなたのフィールド名クエリの場合と同様に、リスナーはse eが含まれている場合は削除されたレコードをフィルタリングしません。

Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute(); 

は、削除されたレコードを返します。

5

$object->getListener()->setOption('disabled',true);

これは、このオブジェクトのすべてのレコードリスナーを無効にします。

関連する問題