2016-04-14 26 views
1

aşağıdaki modeli Verilen: nesneleri

var Project = sequelize.define('project', {/* ... */}) 
var Task = sequelize.define('task', {/* ... */}) 

Project.hasMany(Task, {as: 'Tasks'}); 
Task.belongsTo(Project); 

görevlere değişiklik yapmak ve ben projeyi kaydederken veritabanı güncellenmiş olabilir nasıl. project.save() çağrıldığında

Project.findById(1, {include: Task, as: 'tasks'}).then(function(project) { 
    project.tasks.each(function(task) { 
    task.status = 'done'; 
    }); 
    project.status = 'closed'; 
    project.updatedBy = 'user'; 
    // ...many more statements that modify the project and tasks for example 
    project.save(); // << I want this to save the whole hierarchy to the database, similar to how Hibernate does it, if some people are familiar 
}); 

, görevler güncellenmez. Niye ya?

+0

Neden "görevleri [0] .save();"? – aray12

+0

@ aray12 belki de benim örneğim çok basitti, kodu biraz güncelledim, ayrıca projenin değiştireceğim başka birçok ilişki olduğunu da hayal edin. Tek bir üst nesne üzerinde '.save()' veya başka bir yöntem çağırmak için bir uzak olmalı ve tüm hiyerarşi veritabanına kaydedilmelidir. – Strelok

cevap

1

find veya findAll kullanırsanız, Eager loading'da açıklandığı gibi istekli yüklemeden yararlanabilirsiniz. include: [Task]

katılmak ve görevler için sorgulamak gerekmez bir iç var Bu şekilde:

sizin gibi niteliğini include kullanmak gerekir Bunu yapmak için.

Yukarıdaki kod dayanarak, sahip olabilir:
(mükemmel çalışmıyor eğer maalesef şu anda bu kodu test edemez):

Project.find({ where: {id: 1}, include: [{model: Task, as: 'task'}]}) 
    .then(function(project) {  
     project.task[0].updateAttributes({ 
      status = 'done'; 
     }).then(function() { 
      //done! 
     }); 
    }); 

Bu answer çok yararlı olabilir.