【问题标题】:Sequelize delete instance with n:m and 1:m associations and update Model使用 n:m 和 1:m 关联续集删除实例并更新模型
【发布时间】:2018-12-30 13:43:21
【问题描述】:

我的 postgresql 数据库中有 2 个模型并使用 sequelize 和节点:

  1. 用户
  2. 交易

并像这样关联:

UserModel.hasMany(TransactionModel, { as: 'sentTransactions', foreignKey: 'senderId' });
UserModel.hasMany(TransactionModel, { as: 'receivedTransactions', foreignKey: 'receiverId' });
UserModel.belongsToMany(TransactionModel, { as: 'transactionLikes', through: 'UserLike', foreignKey: 'userId' });
TransactionModel.belongsTo(UserModel, { as: 'receiver' });
TransactionModel.belongsTo(UserModel, { as: 'sender' });
TransactionModel.belongsToMany(UserModel, { as: 'likers', through: 'UserLike', foreignKey: 'transactionId' });

这意味着一个用户有很多接收和发送的交易,每个用户可以“喜欢”很多交易。

如何删除交易并删除所有关联(接收者、发送者、喜欢者)?我也不想删除用户。

我还想更新这样定义的用户模型,以添加“电子邮件”属性:

const UserModel = db.define('user', {
   id: { type: Sequelize.STRING, unique: true, primaryKey: true },
   firstName: { type: Sequelize.STRING  },
   lastName: { type: Sequelize.STRING },
   username: {
    type: Sequelize.STRING,
    unique: {
    args: true,
    msg: USERNAME_IS_TAKEN,
   },
 }

如何更新模型?现有实例会怎样?

提前感谢您的帮助!

【问题讨论】:

  • 这与其说是一个 PostgreSQL 问题,不如说是对您选择的 ORM 的调查。您正在寻找的是带有 ON DELETE CASCADE / SET NULL / DO NOTHING 的外键,但我不确定它会生成什么样的 SQL。

标签: postgresql sequelize.js


【解决方案1】:

根据this tutorial,您的 M:N 关系应该可以像您期望的那样开箱即用:

对于 n:m,两者的默认值都是 CASCADE。这意味着,如果您从 n:m 关联的一侧删除或更新一行,则连接表中引用该行的所有行也将被删除或更新。

此外,为了强制执行CASCADE 行为,您还可以将onDelete 选项传递给关联调用。像这样的东西应该可以解决问题:

TransactionModel.belongsToMany(UserModel, { as: 'likers', through: 'UserLike', foreignKey: 'transactionId', onDelete: 'CASCADE' });

将电子邮件属性添加到用户模型应该很简单:

const UserModel = db.define('user', {
    id: {
        type: Sequelize.STRING,
        unique: true,
        primaryKey: true
    },
    firstName: { type: Sequelize.STRING  },
    lastName: { type: Sequelize.STRING },
    username: {
        type: Sequelize.STRING,
        unique: {
            args: true,
            msg: USERNAME_IS_TAKEN,
        }
    },
    email: { type: Sequelize.STRING }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多