2009-09-24 8 views
6

Mam zachowanie softdelete doktryny dołączone do wszystkich moich modeli. Czy jest jakiś sposób na usunięcie konkretnego rekordu?Jak odłączyć zachowanie w Symfony/Doctrine?

W przypadku cakepha pamiętam odłączenie zachowania ... usunięcie rekordu, a następnie ponowne dołączenie zachowania.

Czy jest coś podobnego w symfony/doktrynie? Jeśli tak, to w jaki sposób mogę odłączyć zachowanie?

Pozdrowienia

Odpowiedz

9

Pomyśl pójdę na drodze Zed, ale dla kompletności:

Sposób detektor zdarzeń do kasowania (wybierz) na miękkim zachowań kasowania zawiera:

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

Oznacza to, że jeśli jednoznacznie wymień pole w zapytaniu, nie zastosuje transformacji do zapytania.

Tak więc, jeśli zrobić:

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

nie będzie stosować miękką usuwania rzeczy i rzeczywiście usunąć rekord. Zauważ, że możesz zrobić cokolwiek z t.deleted, właśnie zrobiłem coś, co zawsze będzie prawdą. Pseudonim ("t.") Jest również ważny, aby działał.

Ta sztuczka działa także w przypadku selekcji, czyli tam, gdzie normalnie go używałem.

Jak mówię jednak, myślę, że ładniej zrobić:

$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); 

W szczególności, nadal można użyć metody delete() zamiast ręcznie tworzyć kwerendy. Jednym z plusów dla metody zapytania jest to, że jeśli masz inne zachowania związane z zapisem, będą one nadal respektowane.

+1

Prawdopodobnie powinieneś raczej przechowywać poprzednią wartość Doctrine :: ATTR_USE_DQL_CALLBACKS zamiast ustawiać wartość false i true. Co by było, gdyby CALLBACKS był wyłączony przed napotkaniem tego kodu? –

+0

tak ... powinienem ... edytować. – benlumley

+0

(chociaż jeśli callbacki są wyłączone, miękkie usuwanie nie działa) – benlumley

1

Spróbuj wywołać to, należy wyłączyć obsługę zachowania.

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

Jako brudny sposób można wygenerować zapytanie SQL, które usuwa wpis z tabeli.

+0

nah .. myślę, że to jest brudne !! .. dzięki mimo to jednak .. – Yashvit

+0

OK. Spróbuj połączenie, które dodałem. Nie próbowałem, ale myślę, że to powinno działać. – Zed

+0

fajne .. sprawi, że ... – Yashvit

1

link text Myślę, że ta funkcja i ustawienie wywołań zwrotnych dql na false, tak jak na menedżerze, powinno załatwić sprawę :).

13

umm .. the SoftDelete behavior zawiera wiele ładniejszy sposób to zrobić ... po prostu zadzwonić

$record->hardDelete(); 
+0

tak - polecam to jest akceptowane przed moim pomysłem. Od tego czasu zaczęłam używać tego. – benlumley

1

chciał zgodzić się z Joshua Coady, że najlepszym sposobem byłoby wykorzystanie

$record->hardDelete() 

Jednak chciałem też dodać tutaj, ponieważ jest to jeden z pierwszych wyników w google dla oderwania się od zachowania w doktrynie, że najłatwiejszym sposobem oderwania się od zachowania dla "zaznaczeń" jest po prostu dodanie "deleted_at" (lub cokolwiek, co nazwałeś swoim polem jak w zapytaniu, słuchacz wygląda na se e jeśli jest uwzględnione, a jeśli tak, nie filtruje usuniętych rekordów.

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

zwróci skasowane rekordy.

5

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

To spowoduje wyłączenie wszystkich słuchaczy rekord dla tego obiektu.

Powiązane problemy