Удаление связанных записей в yii2 — лучшие практики

В моей базе данных используется механизм MyISAM, поэтому я не могу вызвать действие каскадного удаления, поскольку MyISAM его не поддерживает. В то же время я хотел бы удалить связанные записи в своем приложении yii2. Как я могу это сделать?


person Oleksandr Pyrohov    schedule 27.05.2015    source источник
comment
Возможный дубликат Yii2: как одновременно удалить связанные моделирует данные из базы данных?   -  person Anton Rybalko    schedule 22.01.2018


Ответы (2)


Примечание: приведенное ниже решение будет работать, только если вы используете метод удаления ActiveRecord.

Вы можете использовать метод beforeDelete и удалить соответствующие записи — в этом случае вы напишете код один раз, и он будет выполняться каждый раз, когда вы вызываете $model->delete().

Или вы можете добавить обработчик к событию EVENT_BEFORE_DELETE.

person rkm    schedule 27.05.2015
comment
Простите за поздний ответ. Я думаю, что в первую очередь оптимизация зависит от самой базы данных (правильных индексов и т.д.). Как вариант, вы можете создать хранимую процедуру, которая удаляет связанные записи и вызывать эту процедуру... - person rkm; 28.05.2015
comment
Как насчет создания триггеров? - person Patryk Radziszewski; 29.05.2015

Есть несколько вариантов решения этой проблемы.

1) Создайте триггер на стороне БД:

CREATE TRIGGER trigger_name
BEFORE DELETE ON table_name FOR EACH ROW

BEGIN    
   -- variable declarations    
   -- trigger code    
END;

2) Удалите связанные записи внутри yii2 beforeDelete функция:

public function beforeDelete() {
    if (!parent::beforeDelete()) {
        return false;
    }
    // ... custom code here ...
    return true;
}

Триггеры работают быстрее и хорошо обеспечивают ссылочную целостность, поэтому я выбрал их.

person Oleksandr Pyrohov    schedule 06.08.2015