gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:50:00 26 4
gpt4 key购买 nike

我目前正在使用带有 Sequelize + MySQL 的 Express,我想知道解决这个问题的最佳方法是什么。如果这是一个基本问题,我深表歉意,因为我对 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);

但是,这样做的问题是它“创造”了鞋,这会导致重复。我基本上想要一个名为“鞋子”的表,里面有鞋子,然后用户只需根据它有什么鞋子来引用 ID。

不确定执行此操作的最佳方法是什么,尤其是当用户拥有多双鞋时。在伪我想我想要一些像鞋子 id 的数组,例如 shoes: [1, 2, 3, 4] 当被查询然后以某种方式在鞋子表中查找并插入到用户响应。

显然我可以在原始 SQL 中做类似的事情,但我认为考虑到 Sequelize 的强大功能,必须有更好的方法来解决这个问题。

希望有人能就此提供一些建议和帮助!

最佳答案

  1. 我推荐使用 tableName 选项。
  2. 如果您想要存储 Users、Shoes 以及每个用户所穿鞋子的信息,您需要创建第三个表。这个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 .

关于mysql - 如何在 Sequelize 中配置一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53455341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com