usuwanie kaskadowe

Mam taką bazę danych (w uproszczeniu):

Klient

id

imie

nazwisko

Wniosek

id

jakies_dane

id_klienta

Decyzja

id

jakies_dane

id_wniosku

I w każdym modelu mam funkcję usuwającą powiązane modele, np we wniosku:


protected function beforeDelete()

	{

		Decyzja::model()->deleteAll('wniosek_idwniosek='.$this->idwniosek);

		return true;

	}

No i przy usuwaniu np. wniosku są usuwane wszystkie decyzje, ale już przy usuwaniu klienta się wywala, tak jakby nie wykonuje beforeDelete w podmodelu (we wniosku).

Hmm. Osobiście uważam, że powinieneś to zrobić prościej - czyli pozwolić bazie danych na automatyczne usunięcie powiązanych rekordów z innych tabel. W MySQL w tabelach typu InnoDB wystarczy zdefiniować odpowiednie klucze obce wraz z warunkiem ON DELETE CASCADE (w tabelach wniosek i decyzja). Wtedy np. po usunięciu klienta nastąpi kaskadowe usunięcie wszystkich wniosków i decyzji z nim powiązanych. Ja bym kombinował w tym kierunku …Jeśli to inna baza to warto sprawdzić czy obsługuje TRIGGERY, które też można wykorzystać do usuwania powiązanych rekordów).

baza jest trochę bardziej złożona dlatego chciałem mieć pełną kontrolę nad usuwaniem i zrobić to od strony programowej, poza tym w niektórych modelach w funkcjach beforeDelete() mam operacje zmieniania różnych wartości a nie tylko usuwanie i to również nie działa przy usuwaniu 2 poziomy wcześniejszego modelu.

Nie wiem, czy to cokolwiek pomoże w Twoim problemie, ale w jakimś tam kodach zwróciłem uwagę na fakt, że w funkcjach typu beforeDelete() nie powinieneś używać return true tylko przed lub po własnej funkcji wywołać parent->beforeDelete(). Tym różni się EDP (event-driven programming) od podejścia proceduralnego. Może gdzieś w tych okolicach tkwi problem?