【问题标题】:Sails.js waterline ORM removing data from multiply modelsSails.js 水线 ORM 从多重模型中删除数据
【发布时间】:2014-03-17 18:10:49
【问题描述】:

假设我有 2 个模型。

用户和俱乐部。

为了简化我的问题,假设 User 只获得了 Id,而 Clubs 获得了 ClubId 和 UserId,因此一个俱乐部可以拥有许多不同的用户。

这是我的问题:

例如,当我删除 ID 为 3 的用户时,我还想删除 ID 为 3 的俱乐部中的所有用户。如何实现?

【问题讨论】:

    标签: javascript sails.js waterline


    【解决方案1】:

    Sails 还不支持级联删除,但您可以自己处理:

    User.destroy({id:3}).exec(function(err, users) {
       if (err) {return res.serverError();}
       var userIds = users.map(function(user){return user.id;});
       Club.destroy({user_id: userIds}).exec(function(err, clubs) {
          // do something
       });
    });
    

    destroy 返回一个包含所有已销毁对象的数组。在您的情况下,由于您是按 ID 搜索,因此(希望)只会返回一个,但如果您使用的条件可能会同时破坏多个用户,您仍然可以使用上述代码清除所有相关俱乐部。

    【讨论】:

    • 在俱乐部中可以有很多用户,例如 ID 为 3 的用户可以在 ClubId 为 1 和 ClubId2 的俱乐部中,所以如果我删除 ID 为 3 的用户,我希望俱乐部模型中的 2 行也将被删除
    • 是的,上面的代码可以做到这一点。任何user_id 在从destroy 返回的用户列表中的俱乐部都将被删除。
    • 实际上,重新阅读您的评论,我不确定我是否完全遵循您的要求。上面的代码将删除已删除用户所属的任何俱乐部,这可能不是您想要的。如果您只需要删除用户与其俱乐部之间的关系以及用户记录,您无需执行任何操作:Sails 会为您处理。只有当你想删除相关的俱乐部记录时,你才需要上面的代码。
    • 谢谢,所以我还有 2 个问题,希望不要打扰你太多:( 1. 在你的代码中,这行做 smth,当我只想删除它们时,我可以让它成为2. 如果我还想从另一个模型中删除,例如 Friends 所有具有该 ID 的用户,如何添加从另一个模型中删除?
    • 1) 您可以将其留空,但如果您从控制器内部调用它,您很可能希望在那里发送响应。 2) 您可以无限期地嵌套这些delete 调用,但它可能难以阅读,因此最好使用async library 之类的东西将您的异步代码组织成更易于管理的块。
    【解决方案2】:

    您可以在删除任何模型后获得 afterDestroy 事件。简单演示如下

    在控制器中:

     Company.destroy({id: 12346798})
        .exec(function(e,r){
    
              return res.json(r);
        });
    

    在 Company.js 模型中:

    afterDestroy: function(destroyedCompany, cb) {
    
        var ids = _.pluck(destroyedCompany, 'id');
    
        if(ids && ids.length){
    
             Department.destroy({company_id: ids})
            .exec(function(e,r){
                CompanyArticle.destroy({company_id: ids}).exec(cb);
            });
    
        }
        else{
            cb();
        }
    
    }
    

    【讨论】:

    • 迄今为止最好的方法之一!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2015-06-11
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多