使用knex.js删除关联的实体

时间:2018-12-19 21:12:53

标签: javascript node.js knex.js

我想通过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?

任何帮助将不胜感激。

1 个答案:

答案 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相关的所有注释也会被数据库本身删除。