2009-09-24 90 views
6

我有關於所有模型的原則的softdelete行爲。有沒有辦法我可以很難刪除一個特定的記錄?如何分離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已關閉,該怎麼辦? – 2010-08-14 02:20:06

+0

是的...我應該...編輯。 – benlumley 2010-08-14 16:55:32

+0

(儘管如果回調關閉,軟刪除不起作用) – benlumley 2010-08-14 16:57:46

1

試着調用它,它應該禁用行爲處理。

$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false); 

作爲一種骯髒的方式,您可以生成一個從表中刪除條目的SQL查詢。

+0

nah ..我認爲這是骯髒的.. ..但無論如何..謝謝.. – Yashvit 2009-09-24 14:28:48

+0

行。試試我添加的電話。還沒有嘗試過,但我想它應該工作。 – Zed 2009-09-24 14:31:16

+0

很酷..會給那個去... – Yashvit 2009-09-24 15:01:40

1

link text我會認爲這個函數和設置使用dql回調爲false就像在經理應該做的伎倆:)。

13

嗯..的SoftDelete behavior包括這樣做的好得多的辦法......就叫

$record->hardDelete(); 
+0

是的 - 推薦在我的想法之前接受它。我從此開始使用它。 – benlumley 2010-08-14 16:57:07

1

想與約書亞科迪同意,最好的方式是使用

$record->hardDelete() 

然而,我也想在這裏添加它,因爲它是谷歌的第一個結果之一,用於分離在學說中的行爲,將「選擇」行爲分離的最簡單方法就是簡單地包含「deleted_at」(或任何您已命名的字段就像在查詢中一樣。監聽者看起來像是一樣e是否包含它,如果是,則不過濾刪除的記錄。

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

將返回刪除的記錄。

5

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

這將禁用所有記錄監聽器此對象。