Всем привет.
Занимаюсь Yii2 уже пару недель и столкнулся с задачей, когда не знаешь куда и копать.
Сейчас уже имеется некий функционал (набор крудов под разные сущности) и встала задача: Убрать реальное удаление записей из базы данных. То есть, по факту, нужно добавить в таблицы новое поле "статус" и при удалении не удалять саму запись, а менять статус у данной записи. Это требует решение таких задач:
1) Убрать из видимости все записи с неактивным статусом (другими словами при find()->all(), search и т.п. добавлять проверку на ":status=Model::STATUS_ACTIVE");
2) При удалении переопределять его работу с удаления по факту, на изменение статуса.
Учитывая что моделей с контроллерами уже внушительное колличество, хотелось бы узнать, какие из этих задач можно решить с помощью событий и поведений, если вообще можно.
Т.к. опыта маловато, то в тех же события с поведениями ещё "плаваю", потому буду рад если кто то разжует как это сделать, или хотя бы подскажет в какую сторону двигаться.
Ну и вообще интересно будет узнать, как бы вы красиво реализовали эту задачу.
Убрать фактическое удаление данных из базы.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Убрать фактическое удаление данных из базы.
Решить можно обе, но я бы не стал. Лучше всё сделать в этом случае явно.
Нравится Yii? Давайте сделаем его лучше!.
Re: Убрать фактическое удаление данных из базы.
Первую задачу решил переопредилением наследуемого в моделях ActiveRecord:
А вторую простым изменением логики actionDelete с delete на update с новым статусом.
Какие могут быть негативные последствия у такого решения?
Код: Выделить всё
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;
}
}
Какие могут быть негативные последствия у такого решения?
Re: Убрать фактическое удаление данных из базы.
Не забудьте это же условие добавлять во все отношения.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Убрать фактическое удаление данных из базы.
1. Новый человек на проекте несколько удивится тому, что стандартные штуки работают не так.
2. Как теперь всё-таки удалить запись?
2. Как теперь всё-таки удалить запись?
Нравится Yii? Давайте сделаем его лучше!.
Re: Убрать фактическое удаление данных из базы.
Удаляйте явно, хорошая IDE найдет все вхождения delete, так что рефакторинг это не проблема.
Будет хуже если потом словите по самое, когда будет неявное поведение и невозможно будет удалить физически запись.
Будет хуже если потом словите по самое, когда будет неявное поведение и невозможно будет удалить физически запись.