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

时间:2018-11-24 05:08:37

标签: mysql node.js express sequelize.js

我目前正在将Express与Sequelize + MySQL一起使用,并且想知道对我来说解决该问题的最佳方法是什么。对于这是一个基本问题,我深表歉意,因为我对Sequelize甚至是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。

不确定执行此操作的最佳方法是什么,尤其是如果用户拥有多双鞋子。用伪代码,我想我想要类似鞋子ID的数组,例如shoes: [1, 2, 3, 4],当查询它们时,便以某种方式在shoe表中查找并插入到User响应中。

很明显,我可以在原始SQL中执行类似的操作,但是我认为,鉴于Sequelize具有强大的功能,必须有一种更好的方法来解决此问题。

希望有人可以为此提供一些建议和帮助!

1 个答案:

答案 0 :(得分:3)

  1. 我建议使用tableName选项。
  2. 如果要存储“用户”,“鞋子”以及有关每个用户拥有的鞋子的信息,则需要创建第三个表。这是n:m关联,因为每个用户可能有几双鞋子,而每个鞋子可能属于几个用户。您可以通过以下几种方法创建该表:

    • 请参阅Model.belongsToMany tutorialapi doc

      User.belongsToMany(Shoe, {through: 'UserShoe'});
      Shoe.belongsToMany(User, {through: 'UserShoe'});
      
    • 定义UserShoe模型,然后关联User,Shoe和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);
      
  3. 我建议您读一本书SQL反模式/ Karwin Bill。罗利和Sequelize association docs