如何在sequelize中配置一对多关系?

myzjeezk  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(258)

我目前正在使用express和sequelize+mysql,想知道解决这个问题的最佳方法是什么。我很抱歉,如果这是一个基本的问题,因为我是相当新的续集,甚至一般sql数据库。
我有个模特 User 像这样;

export default db.define('User', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});

我还有另外一个模型 Shoe 像这样;

export default db.define('Shoe', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  size: {
    type: Sequelize.INTEGER,
    allowNull: true,
  },
  quality: {
    type: Sequelize.ENUM('Brand New', 'Used', 'Collector Item'),
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});

然后我定义了这两者之间的关联。

User.hasMany(Shoe);
Shoe.belongsTo(User);

然而,问题是,这是'创造'的鞋,这导致重复。我基本上想要一个名为“shoes”的表,其中包含鞋子,然后用户只需根据它所拥有的鞋子引用id。
不知道最好的方法是什么,特别是如果用户拥有多个鞋。在pseudo中,我想我想要一个类似于鞋id数组的东西,比如 shoes: [1, 2, 3, 4] 当被查询时,会以某种方式在shoes表中查找并插入到用户响应中。
很明显,我可以在原始sql中执行类似的操作,但是考虑到sequelize的强大功能,我认为一定有更好的方法来实现这一点。
希望有人能提供一些建议和帮助这方面!

lnlaulya

lnlaulya1#

我建议使用tablename选项。
如果要存储用户、鞋子以及每个用户拥有的鞋子的信息,则需要创建第三个表。这个n:m关联,因为每个用户可能有几个鞋,每个鞋可能属于几个用户。可以通过以下几种方式创建此表:
请参阅model.belongtomany教程和api文档

User.belongsToMany(Shoe, {through: 'UserShoe'});
Shoe.belongsToMany(User, {through: 'UserShoe'});

定义用户鞋模型,然后关联用户、鞋和用户鞋模型:

export default db.define('UserShoe', {
  userId: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true
  },
  shoeId: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true
  }
});

User.belongsToMany(Shoe, {through: UserShoe});
Shoe.belongsToMany(User, {through: UserShoe});

或者像这样:

User.hasMany(UserShoe);
UserShoe.belongsTo(User);
Shoe.hasMany(UserShoe);
UserShoe.belongsTo(Shoe);

我建议你读一本书sql反模式/karwin-bill。罗利和sequelize协会的文件。

相关问题