用加入续集销毁记录

Posted

技术标签:

【中文标题】用加入续集销毁记录【英文标题】: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 删除所有拥有特定电话号码的用户。 更好的是,删除所有拥有一系列电话号码的用户。

【问题讨论】:

也许设置级联可以帮助github.com/sequelize/sequelize/issues/8444 【参考方案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);
   );

【讨论】:

以上是关于用加入续集销毁记录的主要内容,如果未能解决你的问题,请参考以下文章

续集“findbyid”不是一个函数,但显然“findAll”是

ActionController::UnknownFormat (ActionController::UnknownFormat): 销毁

销毁一个活动

Sequelize:销毁/删除表中的所有记录

如何正确销毁 ruby​​ on rails 中的关联记录?

销毁对象在java中怎么用