如何在帆水线中实现内部连接


// model Users.js

是用户模型:

module.exports = {
  autoCreatedAt: false,
  autoUpdatedAt: false,
  tableName : 'users',
  attributes: {
    user_id: {
       type: "string",
       primaryKey: true
     },
      name : {
        type : 'varchar'
      }, 
      register_items : {
        collection : 'register',
        via : 'business_owner_id',
        dominant : true
      }
  }
};
// model Register.js
that is register model 
module.exports = {
  autoCreatedAt: false,
  autoUpdatedAt: false,
  tableName: 'register_items',
  attributes: {
    register_id: {
      type: "integer",
      primaryKey: true
    },
    business_owner_id: {
      model: 'users'
    }
  }
};
// Controller 
module.exports = {
    getUser : (req,res) => {
        Users.find().populate('register_items')
        .then(users => {
            res.json({status : 200, data : users});
        }).catch(err => {
            res.json({status : 500, message : 'Error ' + err});
        });
    }
};

user.findone(user_id).populate('register_items')

帆水线在SQL和NOSQL数据库的顶部都起作用 - 这意味着模仿内在连接功能的功能可能无法以您在SQL中使用的方式进行。

正如@Crusader在答案中指出的那样,设置模型的方式为您提供了一个不错的单线,用于使用已附加的register项目获取user

Users.findOne(user_id).populate('register_items').exec(function(err, user) {
    // handle errors and empty results...
    console.log(user.register_items); // will be full objects
});

,但看来您已经在问题中使用了这样的代码。

由于该代码也必须在NOSQL的顶部工作,因此您不能保证您可以由数据库完成内部联接。在引擎盖下可能只是两个查询(一个接一个):

  1. 让我的用户
  2. 获取所有关联的寄存器
  3. 附加它们

,对于多对多的关系,情况甚至会更糟!

最重要的是,如果您使用的是水线,那么 - 与使用Mongo或任何NOSQL-涉及多个模型的逻辑相同,您的应用程序(您的代码或Waterline库)可以完成,而不是由数据库完成,您应该相应地计划数据存储。

最新更新