Moja baza danych używa silnika MyISAM pod maską, więc nie mogę wywołać akcji kasowania kasowania, ponieważ MyISAM nie obsługuje tego. W tym samym czasie chciałbym usunąć powiązane rekordy w mojej aplikacji yii2. Jak mogę to zrobić?Usuwanie powiązanych rekordów w Yii2 - najlepsze praktyki
Odpowiedz
Uwaga: poniższe rozwiązanie będzie działać tylko wtedy, gdy używasz ActiveRecord delete method.
Można użyć metody beforeDelete i tam usuwać powiązane zapisy - w tym przypadku napiszemy kod jeden raz i będzie on wykonywany za każdym razem, gdy wywołujemy $model->delete()
.
Lub możesz dodać obsługę do zdarzenia EVENT_BEFORE_DELETE.
Przepraszamy za spóźnioną odpowiedź. Myślę, że przede wszystkim optymalizacja zależy od samej bazy danych (poprawne indeksy itp.). Jako opcję można utworzyć procedurę składowaną, która usuwa powiązane rekordy i wywołuje tę procedurę ... – rkm
Co z tworzeniem wyzwalaczy? –
Zobacz https://stackoverflow.com/questions/31110462 –
Istnieje kilka opcji rozwiązania tego problemu.
1) Tworzenie trigger po stronie DB:
CREATE TRIGGER trigger_name
BEFORE DELETE ON table_name FOR EACH ROW
BEGIN
-- variable declarations
-- trigger code
END;
2) Usuń related records wewnątrz yii2 beforeDelete funkcję:
public function beforeDelete() {
if (!parent::beforeDelete()) {
return false;
}
// ... custom code here ...
return true;
}
wyzwalacze są szybsze, a dobry w egzekwowaniu więzów integralności, dlatego Wybrałem je.
Możliwy duplikat [Yii2: Jak jednocześnie usuwać powiązane dane z bazy danych?] (Https://stackoverflow.com/questions/31110462/yii2-how-to-simultaneously-delete-related-models-data- from-data-base) –