【问题标题】:sailsjs where many to many relationship contains多对多关系包含的sailsjs
【发布时间】:2016-11-03 19:26:24
【问题描述】:

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

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

我正在使用sails v0.12.3

【问题讨论】:

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


    【解决方案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 查询来获取数据。

    【讨论】:

    • 示例 1 没有做我想做的事,它找到所有用户然后过滤每个用户的主题和级别。它不会返回附加到所选主题/级别的所有用户。第二个例子看起来和第一个例子做的一样,因此仍然没有做我们需要做的事情。我们可以使用 .query() 来做到这一点,但我想在不使用本机查询的情况下做到这一点。
    • 我不确定第一个但第二个应该可以正常工作
    • 我需要传入级别和传入主题的用户列表,而不仅仅是您的代码提供的一个用户。
    • 我已经编辑了代码,为您提供了主题名称为 subject-1 且级别为 level-1 的用户列表。
    • 我已经试过你的代码了。这不会返回我需要的东西。 “users”变量返回未定义,“results”变量返回指定的级别和主题但没有用户。
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多