【问题标题】:SailsJS v0.10 Lookup model by many associationSailsJS v0.10 多协会查找模型
【发布时间】:2014-05-24 22:33:41
【问题描述】:

我一直在享受 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' }

如果您对处理此查找的最佳方式有任何想法,我将不胜感激!

【问题讨论】:

标签: node.js associations sails.js waterline


【解决方案1】:

在查询“用户列表包含 #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 数组。

【讨论】:

  • 谢谢,斯科特。我最终按照您首先提到的思路提出了一个解决方案,找到过滤后的模型类型,然后填充目标模型。
猜你喜欢
  • 2017-05-28
  • 2014-03-03
  • 2014-03-15
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多