Страница 1 из 1

Каскадное удаление данных

Добавлено: 2016.12.11, 12:30
virtuozz
Привет всем! Подскажите правильно ли я делаю.

Допустим есть модель Product и связанная с ней модель Image, то есть товар и изображения к нему.
С этими моделями я организовал CRUD. Но когда удаляешь товар, то изображения удаляются только в БД, а физически загруженные изображения не удаляются, хотя в модели Image прописан метод afterDelete() с удалением изображений. То есть получается, что удаление записей происходит только на уровне связей в БД, а чтобы данные связанных моделей удалялись с диска нужно это действие прописывать в коде самостоятельно?

Например, в контроллере ProductController метод actionDelete() должен быть в таком виде:

Код: Выделить всё

public function actionDelete($id)
    {
        $model = $this->findModel($id);

        if($model->images) {
            foreach ($model->images as $image) {
                $image->delete();
            }
        }

        $model->delete();

        return $this->redirect(['index']);
    }

Re: Каскадное удаление данных

Добавлено: 2016.12.11, 12:38
andrei.obuhovski
Ну да. Можете эту штуку добавить в afterDelete() товара.

Re: Каскадное удаление данных

Добавлено: 2016.12.11, 13:36
virtuozz
andrei.obuhovski писал(а):Ну да. Можете эту штуку добавить в afterDelete() товара.
По идее да, спасибо!

В модели Product добавил метод:

Код: Выделить всё

public function afterDelete()
    {
        if($this->images) {
            foreach ($this->images as $image) {
                $image->delete();
            }
        }

        parent::afterDelete();
    }
Но так не удаляет. Что делаю не так?

Re: Каскадное удаление данных

Добавлено: 2016.12.11, 13:46
andrei.obuhovski
Смею предположить что у вас в БД стоит автоматическое удаление связных записей по внешнему ключу.
Как вариант, перенести эту штуку в beforeDelete()

Re: Каскадное удаление данных

Добавлено: 2016.12.11, 13:47
Alexum
А не правильнее будет это делать в beforeDelete() ?

Re: Каскадное удаление данных

Добавлено: 2016.12.11, 13:50
virtuozz
Все верно! Спасибо!

Сделал так:

Код: Выделить всё

public function beforeDelete()
    {
        if (parent::beforeDelete()) {
            if($this->images) {
                foreach ($this->images as $image) {
                    $image->delete();
                }
            }
            return true;
        } else {
            return false;
        }
    }

Re: Каскадное удаление данных

Добавлено: 2016.12.11, 14:03
andrei.obuhovski
Проверку if($this->images) можно убрать, т.к. там в любом случае вернется массив. И если он пустой будет то foreach просто не выполнится.