2015-05-27 12 views
5

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

+0

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) –

Odpowiedz

1

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.

+1

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

+1

Co z tworzeniem wyzwalaczy? –

+0

Zobacz https://stackoverflow.com/questions/31110462 –

2

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.