Sails.js Waterline ORM удаляет данные из нескольких моделей

Допустим, у меня есть 2 модели.

Пользователь и клубы.

Чтобы упростить мою проблему, предположим, что у пользователя есть только идентификатор, а у клубов есть ClubId и UserId, поэтому у одного клуба может быть много разных пользователей.

Вот моя проблема:

Когда я удаляю, например, пользователя с идентификатором 3, я также хочу удалить всех пользователей из клубов с этим идентификатором 3. Как это сделать?


person CSharpBeginner    schedule 17.03.2014    source источник


Ответы (2)


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 возвращает массив всех уничтоженных объектов. В вашем случае, поскольку вы ищете по идентификатору, будет (надеюсь) возвращен только один, но если бы вы использовали критерии, которые могли бы уничтожить несколько пользователей одновременно, вы все равно могли бы использовать приведенный выше код, чтобы уничтожить все связанные клубы.

person sgress454    schedule 17.03.2014
comment
в клубах может быть много пользователей для экзамена. Пользователь с идентификатором 3 может быть в клубе с идентификатором ClubId 1 и ClubId2, поэтому, если я удалю пользователя с идентификатором 3, я надеюсь, что 2 строки из модели клубов также будут удалены. - person CSharpBeginner; 18.03.2014
comment
Да, приведенный выше код сделает это. Любой клуб, чей user_id находится в списке пользователей, возвращенных из destroy, будет удален. - person sgress454; 18.03.2014
comment
На самом деле, перечитывая ваш комментарий, я не уверен, что полностью понял то, что вы хотели. Приведенный выше код удалит все клубы, к которым принадлежит удаленный пользователь, что, возможно, не то, что вы хотели. Если все, что вам нужно, это удалить отношения между пользователем и его клубами вместе с записью о пользователе, вам не нужно ничего делать: Sails сделает это за вас. Только если вы хотите удалить связанные записи клуба, вам понадобится приведенный выше код. - person sgress454; 18.03.2014
comment
Спасибо, поэтому у меня есть еще 2 вопроса, надеюсь, вы не слишком беспокоитесь :( 1. В вашем коде эта строка делает что-то, когда я просто хочу удалить их, я могу просто оставить ее пустой? 2. Если я также хочу удалить из другой модели, например, друзей всех пользователей с этим идентификатором, как добавить удаление также из другой модели? - person CSharpBeginner; 18.03.2014
comment
1) Вы можете оставить его пустым, но если вы вызываете его из контроллера, вы, скорее всего, захотите отправить туда ответ. 2) Вы можете бесконечно вкладывать эти delete вызовы, но их может быть трудно читать, поэтому лучше использовать что-то вроде асинхронная библиотека для организации асинхронного кода в более управляемые блоки. - person sgress454; 18.03.2014
comment
Итак, у меня есть последний вопрос Уважаемый Скотт Гресс, Насколько я знаю, в Sails.js мы автоматически выполняем такие операции, как удаление в каждой модели, так как же настроить, чтобы эта функция User.destory вызывалась каждый раз, когда я удаляю кого-либо? - person CSharpBeginner; 18.03.2014
comment
Если вы используете текущую основную ветку Waterline и начиная со следующего выпуска исправления, вы сможете использовать для этого метод класса модели afterDestroy (values, cb). - person sgress454; 18.03.2014
comment
Поддерживается ли сейчас каскадирование? - person Noitidart; 10.12.2018

Вы можете получить событие 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();
    }

}
person Nishchit    schedule 17.03.2015
comment
На сегодняшний день это один из лучших способов сделать это! Спасибо ! - person Unispaw; 09.06.2016