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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
virtuozz
Сообщения: 14
Зарегистрирован: 2016.11.11, 14:05

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

Сообщение virtuozz » 2016.12.11, 12:30

Привет всем! Подскажите правильно ли я делаю.

Допустим есть модель 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']);
    }

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

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

Сообщение andrei.obuhovski » 2016.12.11, 12:38

Ну да. Можете эту штуку добавить в afterDelete() товара.

virtuozz
Сообщения: 14
Зарегистрирован: 2016.11.11, 14:05

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

Сообщение virtuozz » 2016.12.11, 13:36

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

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

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

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

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

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

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

Сообщение andrei.obuhovski » 2016.12.11, 13:46

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

Аватара пользователя
Alexum
Сообщения: 674
Зарегистрирован: 2016.09.26, 10:00

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

Сообщение Alexum » 2016.12.11, 13:47

А не правильнее будет это делать в beforeDelete() ?

virtuozz
Сообщения: 14
Зарегистрирован: 2016.11.11, 14:05

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

Сообщение virtuozz » 2016.12.11, 13:50

Все верно! Спасибо!

Сделал так:

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

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

andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

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

Сообщение andrei.obuhovski » 2016.12.11, 14:03

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

Ответить