NodeJS 续集:如何更新与协会?

8mmmxcuj  于 2023-06-22  发布在  Node.js
关注(0)|答案(2)|浏览(152)

我有这样的模型结构,使用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'
  }]
});

但是,当使用更新方法时,它只更新“公司”的数据,但“地址”不会改变。
有没有人经历过这个问题,并有一个解决方案?我在续集手册里找不到任何东西

qlckcl4x

qlckcl4x1#

我真的不知道关联创建选项是如何工作的,IRL。据我所知,SQL没有办法一次插入多个表。所以,我的猜测是有一些自动魔术正在进行。
WRT更新时,你会被一个很好的老式的多步骤保存/创建/更新过程卡住。我不知道你的约束是什么,但看看关联设置器。这是一个破坏性的小家伙,所以小心。但是如果用户可以在PUT调用上更新、添加或删除Address,则它会特别有用。
这可能是值得的putting this whole effort on one transaction。这不会降低查询的成本。但如果出了问题,它们会一起回滚。

t0ybt7op

t0ybt7op2#

使用@hatchifyjs/sequelize-create-with-associations,它就像这样简单:

const company = await Company.create({
  name: 'Name',
  email: 'email@email.com',
  addresses: [
    {
      street: 'Street',
      zipcode: '12345',
      city: 'City'
    }
  ]
});

await Company.update({
  name: 'Updated',
  addresses: [
    {
      street: 'New Street',
      zipcode: '54321',
      city: 'New City'
    }
  ]
}, { where: { id: company.id } });

相关问题