Задать вопрос
@smigles

Как синхронизировать записи в БД с массивом?

Есть массив, получаемый на основе данных с формы, вида ['value1', 'value2', 'value3', ...] и набор записей в таблице в базе данных вида:
group | value
--------------
1     | value1
1     | value2
1     | value3
1     | ...

Нужно синхронизировать записи в БД с массивом следующим образом:
  1. Если значения нет в таблице, но оно есть в массиве, то нужно добавить это значение в таблицу.
  2. Если значения нет в массиве, но оно есть в таблице, то нужно удалить это значение из таблицы.
  3. Если значение есть и в массиве, и в таблице, то ничего не делать.

Как можно решить эту задачу оптимальным способом? Желательно средствами Yii, когда записи представлены в виде ActiveRecord, чтобы не городить велосипед со множественными циклами.
  • Вопрос задан
  • 99 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Это не имеет особого отношения к Yii. Это обычная работа с массивами и ООП. А как вы будете сохранять (через AR, Doctrine) и куда (mysql, postgresql) не имеет значения.

Сначала удаляем все из базы. Потом присваиваем новые.

Пример Сущности.

Чтобы со связями можно было работать так же как с массивами-объектами, то лучше использовать yii2-save-relations-behavior
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
удалить отсутствующие поля 'delete ... where value not in (...)', потом replace'ом добавить/обновить записи
Ответ написан
kimono
@kimono
Web developer
Можно пойти через поведения. Создать поле is_old в таблице атрибутов модели. Создать behavior для модели, в котором определить методы afterInsert, beforeUpdate, afterUpdate, afterDelete, и производить в них "чистку". Далее следующая логика:
afterInsert - тут понятно, вставляем все значения из массива в базу
beforeUpdate - помечаем все записи в базе флагом is_old = true
afterUpdate - идёт вставка значений из массива с установленным значением is_old = false, а при существовании записи в базе - обновляем is_old = false, затем далее удаляем все записи с is_old = true
afterDelete - удаляем все значения из базы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы