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.
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? –
tak ... powinienem ... edytować. – benlumley
(chociaż jeśli callbacki są wyłączone, miękkie usuwanie nie działa) – benlumley