我有關於所有模型的原則的softdelete行爲。有沒有辦法我可以很難刪除一個特定的記錄?如何分離Symfony/Doctrine中的行爲?
在cakephp我記得分離的行爲...刪除記錄,然後重新附加行爲。
symfony/doctrine中有類似的東西嗎?如果是這樣,那麼我如何分離一個行爲?
乾杯
我有關於所有模型的原則的softdelete行爲。有沒有辦法我可以很難刪除一個特定的記錄?如何分離Symfony/Doctrine中的行爲?
在cakephp我記得分離的行爲...刪除記錄,然後重新附加行爲。
symfony/doctrine中有類似的東西嗎?如果是這樣,那麼我如何分離一個行爲?
乾杯
想我會去的捷思銳的方式,但對於完整性:
的事件監聽方法刪除(選擇)的軟刪除行爲包括:
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()方法,而不必手動創建查詢。查詢方法的一個優點是,如果您有其他行爲附加到記錄,他們仍然會受到尊重。
link text我會認爲這個函數和設置使用dql回調爲false就像在經理應該做的伎倆:)。
嗯..的SoftDelete behavior包括這樣做的好得多的辦法......就叫
$record->hardDelete();
是的 - 推薦在我的想法之前接受它。我從此開始使用它。 – benlumley 2010-08-14 16:57:07
想與約書亞科迪同意,最好的方式是使用
$record->hardDelete()
然而,我也想在這裏添加它,因爲它是谷歌的第一個結果之一,用於分離在學說中的行爲,將「選擇」行爲分離的最簡單方法就是簡單地包含「deleted_at」(或任何您已命名的字段就像在查詢中一樣。監聽者看起來像是一樣e是否包含它,如果是,則不過濾刪除的記錄。
Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();
將返回刪除的記錄。
$object->getListener()->setOption('disabled',true);
這將禁用所有記錄監聽器此對象。
您可能應該存儲Doctrine :: ATTR_USE_DQL_CALLBACKS的前一個值,而不是設置爲false和true。如果在遇到代碼之前CALLBACKS已關閉,該怎麼辦? – 2010-08-14 02:20:06
是的...我應該...編輯。 – benlumley 2010-08-14 16:55:32
(儘管如果回調關閉,軟刪除不起作用) – benlumley 2010-08-14 16:57:46