2

我正在构建一个相对较大的 NodeJS 应用程序,我目前正在尝试弄清楚如何从数据库中获取我需要的数据。这是我的模型的一部分:

一个用户有一个角色,该角色可以访问许多模块(其中有一个表 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);
      })

但我不能这样做,因为 item 只包含 role_id 和 module_id。如果我想获得名称,我将不得不这样做item.getModule(function() {...}),但结果将是异步的......所以我真的不明白我如何最终得到一个包含用户有权访问的模块名称的数组。 ..有什么想法吗?

另外,这不是比实际运行一个带有许多 JOIN 的 SQL 查询慢得多吗?因为正如我所见,ORM 进行了多次查询以获取我想要的数据......

谢谢!

4

1 回答 1

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.

  });

可能值得一看。

于 2013-08-12T07:26:18.900 回答