Sequelize: как обновить с помощью ассоциаций?

#javascript #node.js #postgresql #sequelize.js

#javascript #node.js #postgresql #sequelize.js

Вопрос:

У меня есть такая структура моделей, использующая Sequelize:

 class Company extends Model {
    static init(sequelize) {
        super.init({
            name: { type: DataTypes.STRING },
            email: { type: DataTypes.STRING }
        }, {
            sequelize
        });
    }

    static associate(models) {
        this.HasMany(models.Address, { foreignKey: 'company_id', as: 'addresses' })
    }
}

class Address extends Model {
    static init(sequelize) {
        super.init({
            street: { type: DataTypes.STRING },
            zipcode: { type: DataTypes.STRING },
            city: { type: DataTypes.STRING }
        }, {
            sequelize
        });
    }

    static associate(models) {
        this.BelongsTo(models.Company, { foreignKey: 'company_id', as: 'company' })        
    }
}
  

Мне нужно, чтобы «Компания» и «Адрес» обновлялись одновременно в базе данных, когда у API есть запрос put, отправляющий файл JSON.

Вставка работала одновременно с кодом:

 await Company.create(company,{
  include: [{
    association: 'addresses'
  }]
});
  

Однако при использовании метода обновления он обновляет только данные «Компании», но «Адрес» не меняется.

Кто-нибудь проходил через это и имеет решение? Я ничего не смог найти в руководстве по продолжению

Ответ №1:

Я действительно не знаю, как работает опция associated-create, IRL. Насколько я знаю, в SQL нет способа вставлять в несколько таблиц одновременно. Итак, я предполагаю, что происходит какое-то автоматическое волшебство.

После обновления вы застряли в старом добром многоэтапном процессе сохранения / создания / обновления. Я не знаю, каковы ваши ограничения, но посмотрите на ассоциативный сеттер. Это разрушительный маленький баггер, так что будьте осторожны. Но это может быть особенно полезно, если пользователь может обновлять, добавлять или удалять адрес при этом вызове PUT.

Кроме того, возможно, стоит приложить все эти усилия к одной транзакции. Это не сделает запрос менее дорогостоящим. Но если что-то пойдет не так, они откатываются вместе.

Комментарии:

1. Мне действительно нужно использовать единственную транзакцию. Я нашел кое-что интересное об использовании Promise.all для решения этой проблемы… Если это сработает, я опубликую решение здесь. Спасибо!