我在我的项目中使用Sequelize。这是两个模型:

const User = db.define('user', {
  name: Sequelize.STRING,
  password: Sequelize.STRING
})
const Product = db.define('product', {
  name: Sequelize.STRING,
  price: Sequelize.INTEGER
})

现在,用户可以购买产品,并且我具有如下所示的关联设置:
Product.belongsToMany(User, {through: 'UserProducts'})
User.belongsToMany(Product, {through: 'UserProducts'})

我也有带有其他列的UserProducts表。
const UserProducts = db.define('UserProducts', {
  status: Sequelize.STRING
})

Sequelize创建一个包含userId和productId组合的组合键,并且只允许包含userId和productId组合的一条记录。因此,例如,userId 2和productId 14。

这对我来说是个问题,因为有时人们想多次购买。我需要以下方案之一才能工作:
  • 不要使用复合键,而是将一个全新的自动增量列用作UserProducts中的键。
  • 而不是仅使用userId和productId来创建 key ,而是让我在 key 中添加另一列,例如status,以便唯一 key 是这三个的组合。

  • 我确实想使用关联,因为它们提供了许多强大的方法,但是我想更改唯一键以使其能够以用户ID和产品ID相同的组合添加多行的方式来工作。

    并且由于我的模型/数据库已经在运行,因此我将需要使用迁移来进行此更改。

    对此的任何帮助都将受到高度赞赏。

    最佳答案



    由于在UserProducts表中还具有其他属性,因此需要为UserProducts定义模型,然后告诉续集使用该模型,而不是创建自己的模型

    class User extends Model {}
    User.init({
        name: Sequelize.STRING,
        password: Sequelize.STRING
    }, { sequelize })
    
    class Product extends Model {}
    ProjProductect.init({
        name: Sequelize.STRING,
        price: Sequelize.INTEGER
    }, { sequelize })
    
    class UserProducts extends Model {}
    UserProducts.init({
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      status: DataTypes.STRING
    }, { sequelize })
    
    User.belongsToMany(Project, { through: UserProducts })
    Product.belongsToMany(User, { through: UserProducts })
    

    引用:Sequelize v4 belongsToMany

    更新

    由于您正在使用v3,并且已经为UserProducts表创建了模型,因此请使用以下代码段
    UserProducts = db.define('UserProducts', {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      status: DataTypes.STRING
    })
    

    10-04 19:51