どのように私はsymfony /教義で行動を切り離すのですか?
質問
私は私のモデルのすべてに添付の教義のsoftdelete振る舞いを持っています。私はハード、特定のレコードを削除することができます方法はありますか?
CakePHPでは、私は行動を取り外す覚えて...レコードを削除してから行動を取り付け直します。
symfonyの/ドクトリンで同様のものがありますか?そうならば、どのように私は行動を切り離していますか?
乾杯
解決
私はゼットの道のために行くだろうと思うが、完全性について:
ソフト削除動作の削除のためのイベントリスナーのメソッド(と選択)が含まれています:
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で何でもできることに注意してください、私は常にtrueになります何かをやりました。エイリアス(「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つのプラスは、あなたがレコードに添付他の振る舞いを持っている場合、彼らはまだ尊重されるということです。
他のヒント
うーん... SoftDelete行動を呼び出すだけ...これを行うには非常に良くする方法を含んでいる。
$record->hardDelete();
$object->getListener()->setOption('disabled',true);
これは、このオブジェクトのすべてのレコードリスナーを無効にします。
それが動作処理を無効にする必要があり、これを呼び出してみます。
$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);
あなたがテーブルからエントリを削除するSQLクエリを生成することができます。
汚いやり方として、タグの最善の方法を用いることであろうというヨシュアCoadyに同意する募集
$record->hardDelete()
それは「選択」のための行動を切り離すための最も簡単な方法は、「deleted_at」(またはものは何でも持っているが含まれるように、単純であることを教義で行動を取り外すためのGoogleの最初の結果の一つですので、しかし、私はまた、ここに追加したいですクエリのように自分のフィールドの名前。リスナーはそれが含まれているかどうかを確認しますので、削除されたレコードを除外していない場合ます。
Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();
削除されたレコードを返します。