包含多对多关系的sailsjs

时间:2016-07-01 11:36:30

标签: javascript node.js orm sails.js waterline

我试图找到正在做某个主题的所有用户。这是关系:

user.js的

attributes: {
    subjects: { collection: 'subject', via: 'users', dominant: true }, // Many to Many
    levels: { collection: 'level', via: 'users', dominant: true } // Many to Many
}

Subject.js

attributes: {
    users : { collection: 'user', via: 'subjects' } // Many to Many
}

Level.js

attributes: {
    users : { collection: 'user', via: 'levels' } // Many to Many
}

我希望能够在用户上进行查找,并且仅返回与特定主题有关系的用户。像这样:

User.find({ subjects: { 'contains': 1 } })
  .exec(function(err, results){
      if(err) return res.serverError(err);
      users = results;

      return res.json(users);
  });

我知道我可以这样做:

Subject.findOne({id:1})
  .populate('users')
  .exec(function(err, results){
      if(err) return res.serverError(err);
      users = results.users;

      return res.json(users);
  });

但是我不想这样做,因为我可能想要过滤不仅仅是主题。例如,使用上述内容,我可能希望找到正在进行主题1的所有用户 AND 正在执行第2级。

User.find({ subjects: { 'contains': 1 }, levels: { 'contains': 2 } })
  .exec(function(err, results){
      if(err) return res.serverError(err);
      users = results;

      return res.json(users);
  });

我正在使用风帆v0.12.3

1 个答案:

答案 0 :(得分:1)

据我所知,没有这样的机制可以像你提到的那样进行搜索。

虽然你可以通过以下方式实现:

  1. populate

    中使用条件
     User.find()
      .populate('subjects', {
        name: 'subject-1'
      })
      .populate('levels', {
        name: 'level-1'
      })
      .exec(function(err, user) {
        if (err) {
          // Error
        }
        sails.log.verbose(user);
      });
    
  2. 使用async

    async.auto({
      subject: function(cb) {
        Subject.findOne({
            name: 'subject-1'
          })
          .exec(cb);
      },
      level: function(cb) {
        Level.findOne({
            name: 'level-1'
          })
          .exec(cb);
      },
      user: ['subject', 'level', function(cb, results) {
        User.find({
            subjects: results.subject.id,
            levels: results.level.id
          })
          .exec(function(err, users) {
            if (err) {
              return cb(err);
            }
            sails.log.verbose(users); // Required user
          });
      }]
    }, function(err, results) {
      // Callback
    });
    
  3. 使用.query() method,您必须编写JOIN查询以获取数据。