【问题标题】:sequelize destroy record with join用加入续集销毁记录
【发布时间】:2017-04-14 21:07:56
【问题描述】:

在我的模型中有一个 Users 表和一个 UserPhones 表。 User.id 是 UserPhones 中的外键。

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
      userid       : {
        type        : DataTypes.UUID,
        primaryKey  : true,
      },
      username : DataTypes.STRING,
    },
    {
      classMethods: {
        associate: (models) => {       
          models.User.hasOne(models.UserPhone, {foreignKey: 'userId'});
        }
      }
    });

  return User;
};


module.exports = (sequelize, DataTypes) => {
  const UserPhone = sequelize.define('UserPhone', {
      id              : {
        type        : DataTypes.UUID,
        primaryKey  : true,
      },
      userId   : {
        type      : DataTypes.UUID,
        references: {
          model     : require('.').User,
          key       : 'userid',
          deferrable: sequelize.Deferrable.INITIALLY_IMMEDIATE
        }
      },
      phoneNumber     : {
        type: DataTypes.STRING
      }
    },
    {
      classMethods: {
        associate: (models) => {
          models.UserPhone.belongsTo(models.User, {foreignKey: 'userId'});
        }
      }
    }
  );
  return UserPhone;
};

销毁电话号码很容易:

UserPhone.destroy({where: {phoneNumber: '123456789'}};

我想通过 sequelize 删除所有拥有特定电话号码的用户。 更好的是,删除所有拥有一系列电话号码的用户。

【问题讨论】:

标签: javascript sql node.js sequelize.js


【解决方案1】:

我认为不可能同时进行 DELETE 和 JOIN 查询。

因此,

我想用 sequelize 删除所有拥有特定电话号码的用户。

UserPhone.findAll({attributes: ['userId'], where: {phoneNumber: '1234'}}
.then(function (userIds) {
    if (userIds.length === 0) 
       return Promise.resolve(true) //nothing to delete
    return User.destroy({where: {id: {$in: userIds}}});
})

删除拥有一系列电话号码之一的所有用户。

var array = ['123', '456'];
UserPhone.findAll({attributes: ['userId'], where: {phone: { $in: array }}}
.then(function (userIds) {
    if (userIds.length === 0) 
       return Promise.resolve(true) //nothing to delete
    return User.destroy({where: {id: {$in: userIds}}});
})

【讨论】:

    【解决方案2】:

    Sequelize 当前不支持destroy 方法上的include 选项:https://sequelize.org/master/class/lib/model.js~Model.html#static-method-destroy

    如果你想避免多个 sql 语句,你将不得不编写一个原始查询: https://sequelize.org/master/manual/raw-queries.html

    例如。

    await sequelize.query(`
        DELETE User
        FROM User
        INNER JOIN UserPhone ON UserPhone.userId = User.userId
        WHERE UserPhone.phoneNumber = :phoneNumber
    `, { replacements: { phoneNumber: '1234'} })
    

    【讨论】:

    • 在 RAW 查询中使用 Join 会产生错误:“关键字 'INNER”附近的语法不正确。我使用了 INNER JOIN 以及 Join 关键字。 [续集第 6 版]
    【解决方案3】:

    据我所知(只是花时间看)破坏不会消除潜在的关系

    const id = parentRecord.id;
    
    return models.sequelize.transaction(function (t) {
      return models.Parent.destroy({ where: { id }}, {transaction: t})
      .then(async function(deleteCount) {
       return await models.Child.destroy({where: { parent.id: id }}, {transaction: t});
       })
      })
      .catch((e) => {
           console.log("Error", e);
           return Promise.reject(e);
       });
    

    【讨论】:

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