如何访问将在 'before delete' 操作挂钩中删除的模态实例?

How to access the modal instance(s) that will be deleted in the 'before delete' operation hook?

before saveafter save 操作挂钩有一个 datainstance 属性 包含将要更改的部分数据或模型实例。参见 here。如何在 before delete 挂钩中访问模型实例?

手头案例:我想在删除特定模型时删除相关项。

我认为您实际上无法访问要删除的特定实例,但您可以访问调用的上下文对象,其中包括用于标识实例的 where 属性 选择删除:

MyModel.observe('before delete', function(context, next) {
  console.log('About to delete some: ' + context.Model.pluralModelName);
  console.log('using the WHERE clause: ' + context.where);

  MyModel.find({ where: context.where }, function(err, models) {
    console.log('found some models:', models);

    // loop through models and delete other things maybe?
  });

  next();
});

这在 the documentation 中,但没有很好地解释。您可以使用 contect.Model 对象获取实例,然后您可以访问相关模型并删除它们。

'this' 始终可以在所有挂钩中访问(之前或之后)。 在销毁模型钩子之前 'this' 对象将包含将要销毁的模型实例回送。

下面是使用 findById 的 jakerella 代码的修改版本,计算并删除相关项目(在 'hasMany' 关系中并命名为 'relatedItems'):

MyModel.observe('before delete', function(context, next) {
    console.log('About to delete some: ' + context.Model.pluralModelName);
    console.log('using the WHERE clause: ' + context.where);

    MyModel.findById(context.where.id, function(err, model) {
        console.log('found model:', model);

        model.relatedItems.count(function(err, count) {
            console.log('found ', count, ' related items');
        });
        model.relatedItems.destroyAll(function(err) {
            if (err) {
                console.log('found ', count, ' related items');
           }
        });

        next();   
   });
});

我也使用 before delete 观察器实现了这个。

在此示例中,有一个与许多产品相关的类别模型,由类别 ID 属性 关联。

它首先根据categoryId搜索所有匹配的Products,然后遍历结果集products逐一删除。

module.exports = function (Category) {

Category.observe('before delete', function (ctx, next) {

    // It would be nice if there was a more elegant way to load this related model
    var Product = ctx.Model.app.models.Product;

    Product.find({
      where: {
        categoryId: ctx.where.id
      }
    }, function (err, products) {
      products.forEach(function (product) {
        Product.destroyById(product.id, function () {
          console.log("Deleted product", product.id);
        });
      });
    });

    next();
  });
};

我尝试使用 destroyAll 方法来实现它,但没有得到预期的结果。

上面的代码对我有用,但看起来它可以增强很多。