質問

私は私のモデルのすべてに添付の教義の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();

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

scroll top