[英]sequelize destroy record with join
In my model there is a Users table, and a UserPhones table.在我的模型中,有一个 Users 表和一个 UserPhones 表。 User.id is a foreign key in 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;
};
Destroying a phoneNumber is easy:销毁电话号码很容易:
UserPhone.destroy({where: {phoneNumber: '123456789'}};
I would like to delete all users that have a specific phone number with sequelize.我想用 sequelize 删除所有拥有特定电话号码的用户。 Even better, delete all users that have one of an array of phone numbers.
更好的是,删除拥有一组电话号码之一的所有用户。
I do not think it is possible to do a DELETE and a JOIN query at the same time.我认为不可能同时执行 DELETE 和 JOIN 查询。
Therefore,因此,
I would like to delete all users that have a specific phone number with sequelize.
我想用 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}}});
})
Delete all users that have one of an array of phone numbers.
删除拥有一组电话号码之一的所有用户。
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}}});
})
Sequelize does not currently support an include
option on the destroy
method: https://sequelize.org/master/class/lib/model.js~Model.html#static-method-destroy Sequelize 目前不支持
destroy
方法的include
选项: https ://sequelize.org/master/class/lib/model.js~Model.html#static-method-destroy
If you want to avoid multiple sql statements, you will have to write a raw query: https://sequelize.org/master/manual/raw-queries.html如果你想避免多个 sql 语句,你将不得不编写一个原始查询: https : //sequelize.org/master/manual/raw-queries.html
Eg.例如。
await sequelize.query(`
DELETE User
FROM User
INNER JOIN UserPhone ON UserPhone.userId = User.userId
WHERE UserPhone.phoneNumber = :phoneNumber
`, { replacements: { phoneNumber: '1234'} })
The best way to do it, as far as I know (just spent time looking) destroy wont remove the underlying relationships据我所知,最好的方法是(只是花时间寻找)销毁不会删除潜在的关系
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);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.