SailsJS v0.10由许多协会查找模型

时间:2014-05-24 22:33:42

标签: node.js associations sails.js waterline

我在v0.10中一直享受新的Sails关系,但我目前最大的挑战是通过他们的协会查找模型。如果我要填充一个手动关联,比如一组ID,这将非常简单。但是,我似乎找不到使用Sails关联处理查找的正确方法。

我提供了一些示例代码,概述了两个模型,即公司和用户。公司可以拥有多个用户,而用户只能拥有一个公司。这是一个非常直接的一对多关系,目标是找到所有匹配用户ID的公司。

## Company.js
name:
  type: 'string'
  required: true

users:
  collection: 'User'
  via: 'company'


## User.js
company:
  model: 'Company'
  required: true

last_name:
  type: 'string'
  required: true

first_name:
  type: 'string'
  required: true


## Lookup Users by Company ID of '2'
User.find(where: company: 2).exec(console.log)

# Result
# [] - Array of users matching that company ID


## ---- The Problem / Question ----
## Lookup Companies by User ID '1'
Company.find(where: users: contains: 1).exec(console.log)

# Result
# Error (E_UNKNOWN) :: Encountered an unexpected error:
# error: column company.users does not exist
# Details:
# { error: 'E_UNKNOWN',
#   summary: 'Encountered an unexpected error',
#   status: 500,
#   raw: 'error: column company.users does not exist' }

我很感激有关处理此查找的最佳方法的任何想法!

1 个答案:

答案 0 :(得分:2)

在查询“所有用户列表包含#1的公司”的情况下,您正在尝试执行子查询,而Waterline目前不支持该子查询。此外,这是一个有点愚蠢的例子,因为每个用户只能拥有一家公司,所以你应该只期待一个结果。在任何情况下,正确的方法只是查找用户#1和填充其公司:

User.findOne(1).populate('company').exec(function(err, user) {
    console.log(user.company);
});

我会留给你把它翻译成Coffeescript;)

要查找公司的所有用户,您可以执行类似的操作:

Company.findOne(123).populate('users').exec(...)

您可以过滤填充的结果,但它与子查询不同:

Company.findOne(123).populate('users', {where: {id: [1,2,3]}}).exec(...)

这将为您提供公司#123并仅为ID值为1,2或3的用户填充其users数组