我在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' }
我很感激有关处理此查找的最佳方法的任何想法!
答案 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
数组 。