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

时间:2017-08-30 06:47:16

标签: sails.js waterline

// 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});
        });
    }
};

2 个答案:

答案 0 :(得分:1)

Users.findOne(USER_ID).populate( 'register_items')

答案 1 :(得分:1)

Sails Waterline在SQL和NOSQL数据库之上工作 - 这意味着模仿内部联接的功能可能无法以您在SQL中习惯的方式进行。

正如@Crusader在他们的回答中指出的那样,你设置模型的方式为你提供了一个很好的单行程序,用于获取已加user项的register

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. 附上他们
  4. 对于多对多的关系来说会更糟糕!

    底线是,如果您使用的是水线,那么 - 就像您使用mongo或任何NOSQL一样 - 涉及多个模型的逻辑可能由您的应用程序(您的代码或水线库)完成,而不是由您的数据库完成,您应该相应地规划您的数据存储。