Как обновить массив объектов с одинаковым значением в reference_id (столбец FK) в Sequelize JS?

#mysql #node.js #orm #sql-update #sequelize.js

#mysql #node.js #orm #sql-обновление #sequelize.js

Вопрос:

У меня есть массив объектов, который выглядит примерно так:

 [
  {
    id: '5b29c08b-597c-460c-a3c7-ac8852b7a5dc',
    option_text: 'njnj',
    answer: false
  },
  {
    id: '8ff5bda6-9335-495c-9c72-15ef258b899b',
    option_text: 'jnjn',
    answer: true
  }
]
  

Здесь answer столбец взаимосвязан, например, если какой-либо из объектов answer установлен на true другой, он будет поступать как false из интерфейса. Итак, я должен обновить всю строку, связанную с указанным идентификатором.
С какой проблемой я сталкиваюсь, так это то, что запрос на обновление не выполняется, но он попадает внутрь then блока кода вместо выдачи ошибки. Ниже приведен мой код для того же:

 // UPDATE Option
exports.updateOption = (req, res, next) => {
  try {
    console.log(req.body);
    db.Option.update(req.body, {
      where: { question_id: req.params.id }
    }).then(() => {
      console.log('A');
      return res.status(200).send(errors.UPDATED_SUCESSFULLY);
    }).catch(err => {
      console.log('B');
      return res.status(204).send(errors.INTERNAL_SERVER);    
    });
  } catch(err) {
    console.log('C');
    return res.status(204).send(errors.INTERNAL_SERVER);
  }
};
  

Пример данных таблицы для того же:
данные

Я имею в виду, что сначала в answer столбец false для всех строк, связанных с одним и тем же question_id , а затем обновить конкретную строку, для которой answer установлено значение true . Но это хороший подход или кто-нибудь может предложить мне какое-то лучшее решение?

Ответ №1:

Вы должны выполнять все обновления в одной транзакции (чтобы избежать несоответствий в БД):

 sequelize.transaction(async transaction => {
  const options = req.body;
  for (const option of options) {
    await db.Option.update(option, {
        where: { question_id: req.params.id },
         transaction
      });
  }
}).then(...