SequelizeJS如何使用1个模型并创建多个表?

时间:2018-12-09 12:21:57

标签: node.js sequelize.js

由于我已经尝试了所有方法,因此希望对此有所帮助,并且在试图弄清楚该怎么做时,文档基本上完全没有用。

从本质上讲,我有一个名为Address的模型,其中包含您期望的所有字段。

此自动创建一个名为Addresses的表,它本身可以正常工作。但是,我也想制作一个使用相同模型的“ Address_History”表。

基本上,我希望这样做,以便在用户输入新地址的路线中,它将旧地址存储在历史记录表中,然后将新地址放入地址表中。 我可以为它做实际的代码,但是我无法使这种可恶的关联像我上面提到的那样使用相同模型的两个独立表那样工作。

我尝试了包括as关键字在内的所有操作,并且似乎要做的就是添加一个额外的列,而不是一个表。

基本上我想要这样的东西(但可以工作);

  User.hasOne(Address, {
    as: 'Address',
  });
  Address.belongsTo(User, {
    as: 'Address',
  });

User.hasMany(Address, {
  as: 'addressHistory',
});
Address.belongsTo(User, {
  as: 'addressHistory',
});

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

as函数中的hasMany()选项不会在数据库中创建新表。要创建新表,您需要调用init()define(),它们是静态函数。但是,您可以通过对ctor和选项进行模块化来使代码保持DRY的状态。例如,

const AddressCommonCtor = { 
  // your common column fields here
};
const AddressCommonOptions = {
  // options here

  // Make sure `modelName` field is not included here
  // because you want to create two different tables with different names in your DB  
};

class Address extends Model {};
class AddressHistory extends Model {};

Address.init(AddressCommonCtor, AddressCommonOptions);
AddressHistory.init(AddressCommonCtor, AddressCommonOptions);

然后您可以将Address和AddressHistory与User关联起来,如下所示:

User.hasOne(Address, {
    as: 'address',
  });
User.hasMany(AddressHistory, {
  as: 'addressHistory',
});