Убрать фактическое удаление данных из базы.

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

Убрать фактическое удаление данных из базы.

Сообщение Yujin »

Всем привет.
Занимаюсь Yii2 уже пару недель и столкнулся с задачей, когда не знаешь куда и копать.
Сейчас уже имеется некий функционал (набор крудов под разные сущности) и встала задача: Убрать реальное удаление записей из базы данных. То есть, по факту, нужно добавить в таблицы новое поле "статус" и при удалении не удалять саму запись, а менять статус у данной записи. Это требует решение таких задач:
1) Убрать из видимости все записи с неактивным статусом (другими словами при find()->all(), search и т.п. добавлять проверку на ":status=Model::STATUS_ACTIVE");
2) При удалении переопределять его работу с удаления по факту, на изменение статуса.
Учитывая что моделей с контроллерами уже внушительное колличество, хотелось бы узнать, какие из этих задач можно решить с помощью событий и поведений, если вообще можно.
Т.к. опыта маловато, то в тех же события с поведениями ещё "плаваю", потому буду рад если кто то разжует как это сделать, или хотя бы подскажет в какую сторону двигаться.
Ну и вообще интересно будет узнать, как бы вы красиво реализовали эту задачу.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Убрать фактическое удаление данных из базы.

Сообщение samdark »

Решить можно обе, но я бы не стал. Лучше всё сделать в этом случае явно.
Yujin
Сообщения: 5
Зарегистрирован: 2015.04.10, 10:10

Re: Убрать фактическое удаление данных из базы.

Сообщение Yujin »

Первую задачу решил переопредилением наследуемого в моделях ActiveRecord:

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

namespace common\components;

use yii\db\ActiveQuery;

class ActiveRecord extends \yii\db\ActiveRecord {

    const STATUS_ACTIVE = 10;
    const STATUS_DELETED = 0;

    public static function find() {
        $ActiveQuery = new ActiveQuery(get_called_class());
        $ActiveQuery->andWhere(['status' => self::STATUS_ACTIVE]);
        return $ActiveQuery;
    }

}
  
А вторую простым изменением логики actionDelete с delete на update с новым статусом.
Какие могут быть негативные последствия у такого решения?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Убрать фактическое удаление данных из базы.

Сообщение ElisDN »

Не забудьте это же условие добавлять во все отношения.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Убрать фактическое удаление данных из базы.

Сообщение samdark »

1. Новый человек на проекте несколько удивится тому, что стандартные штуки работают не так.
2. Как теперь всё-таки удалить запись?
Аватара пользователя
jilizart
Сообщения: 82
Зарегистрирован: 2010.04.22, 18:56
Контактная информация:

Re: Убрать фактическое удаление данных из базы.

Сообщение jilizart »

Удаляйте явно, хорошая IDE найдет все вхождения delete, так что рефакторинг это не проблема.
Будет хуже если потом словите по самое, когда будет неявное поведение и невозможно будет удалить физически запись.
Ответить