我想通过article_id使用knex从商品表中删除。这已在注释表中作为外键存在。
如何测试数据已被删除以及如何将其发送给用户。
我决定通过编写一个函数以.then从这两个函数中删除来实现此目的。看起来像我在右边吗?
exports.deleteArticleById = function (req, res, next) {
const { article_id } = req.params;
return connection('comments')
.where('comments.article_id', article_id)
.del()
.returning('*')
.then((deleted) => {
console.log(deleted);
return connection('articles')
.where('articles.article_id', article_id)
.del()
.returning('*');
})
.then((article) => {
console.log(article);
return res.staus(204).send('article deleted');
})
.catch(err => next(err));
};
目前,我正在使用日志获取正确的数据,但状态为500,但我想我需要尝试获取204?
任何帮助将不胜感激。
答案 0 :(得分:2)
您尝试做的事情称为 cascading deletion ,这些问题最好在数据库级别而不是应用程序级别< / em>。
这意味着您应该定义数据库架构,以便在删除文章时,与之关联/引用的注释也将为您删除。
这是我使用knex.js migrations的方法:
connection.schema.createTableIfNotExists('comment', t => {
t.increments('comment_id').primary()
t.integer('article_id').unsigned() // Add FK...
.references('article.article_id') // that references Article PK...
.onUpdate('CASCADE') // if Article PK is changed, update this FK.
.onDelete('CASCADE') // if referenced Article is deleted, delete this.
t.string('content', 2048)
})
因此,当您运行时:
connection('article').where({ article_id: 1 }).del()
与带有article_id === 1
的Article相关的所有注释也会被数据库本身删除。