2013-08-02 42 views
2

我正在構建一個相對較大的NodeJS應用程序,目前我正試圖弄清楚如何從數據庫中獲取我需要的數據。這裏是我的模型的一部分:在node.js(node-orm)中鏈接模型關係就像在Rails中一樣

一個用戶有一個角色,它可以訪問許多模塊(其中有一個表role_modules來鏈接角色和模塊)。

在Rails中,我會做一些像user.role.modules來檢索他有權訪問的模塊列表。在NodeJS中,它有點複雜。我使用node-orm2以及PostgreSQL。這是我到目前爲止:

req.models.user.find({email: req.body.user}, function(err, user) { 
    user[0].getRole(function(err, role) { 
    role.getModules(function(err, modules) { 
     var list_modules = Array(); 
     modules.forEach(function(item) { 
     console.log(item); 
     list_modules.push(item.name); 
     }) 

但我不能這樣做,因爲項目只包含role_id和module_id。如果我想要這個名字,我將不得不做item.getModule(function() {...}),但結果將是異步的...所以我真的不知道如何最終得到一個包含用戶有權訪問的模塊名稱的數組...有什麼想法嗎?

另外,是不是比實際運行多個JOIN單個SQL查詢慢?因爲就我所見,ORM通過多個查詢來獲得我想要的數據...

謝謝!

+0

據我瞭解,你想從用戶到達模塊,對吧?你有沒有試過'node-orm2'中的關聯? –

+0

嗯,這就是我正在使用的,但即使是這樣,我不太清楚,當所有的請求都是異步的時候,我可以最終得到來自用戶的一系列模塊名稱......另外我不確定關於這個VS在SQL中的一個普通的舊JOIN鏈的良好性能 –

回答

2

我寫了一個名爲bookshelf.js的ORM,旨在簡化SQL中模型之間的關聯和加載關係。這是您的查詢可能會是什麼樣子加載角色上給出你的描述用戶&模塊:

var Module = Bookshelf.Model.extend({ 
    tableName: 'modules' 
}); 

var Role = Bookshelf.Model.extend({ 
    tableName: 'roles', 

    modules: function() { 
    return this.belongsToMany(Module); 
    } 
}); 

var User = Bookshelf.Model.extend({ 
    tableName: 'users' 

    role: function() { 
    return this.hasOne(Role); 
    } 
}); 


User.forge({email: req.body.user}) 
    .fetch({ 
    require: true, 
    withRelated: ['role.modules'] 
    }) 
    .then(function(user) { 

    // user, now has the role and associated modules eager loaded 
    console.log(user.related('role')); 
    console.log(user.related('role').related('modules')) 

    }, function(err) { 

    // gets here if no user was found. 

    }); 

可能是值得考慮看看。

+0

Bookshelf有可能用相關數據的約束來查詢嗎?即提取({require:true,withRelated:['role.modules']})。其中('role.modules.length','>','1')(僞代碼:)) –