用加入续集销毁记录
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): 销毁