如何通过查询参数有选择地填充Sails.js中的Waterline关联?

16
默认情况下,当访问相应的API路由时,Sails会填充模型内的所有关联。有人知道是否可以切换此功能吗?如果我正在处理一对多的关联,可能不想在列出所有项目时填充关联以提高性能。但是,在查看单个项目时,完成填充将很好。
例如,假设一个工单可以有多个评论。当获取案例列表时,我不关心评论,但在查看特定案例时,评论就很重要了。我猜测它的功能如下,但失败了:
localhost:1337/tickets?populate=false

更新

我在 balderdashy/sails#1695 中实现了上述功能。唯一的变化是你可以使用以下方式有选择性地选择要填充哪些关联:

localhost:1337/tickets?populate=[]          // Don't populate anything
localhost:1337/tickets?populate=[comments]  // Only populate comments

这将覆盖蓝图配置中定义的populate内容。

很确定populate不是默认开启的,你必须在查询中显式地写入它,例如 User.findOne(user.id).populate('userFriends').exec(...)(这只是我脑海中的一个小例子)。 - the-lay
如果您直接使用Waterline,那么这是正确的。我所指的是从Sails蓝图处理的请求URL中的populations。在这种情况下,默认情况下启用population,除非您在config/blueprints.js中指定了populate = false - Jason Sims
1
哦,我没有考虑到蓝图,抱歉。你可以自己创建路由来引导至你的控制器行为,并根据URL GET参数返回查询结果。 - the-lay
我同意@IļjaGubins的观点。我认为没有任何方法可以使用蓝图路由来实现这一点。如果您想要这样做,您将不得不覆盖它们。 - Mandeep Singh
@jason 你的解决方案非常好。你应该将详细信息编写为答案。顺便说一句,?populate=false 在我这里也适用(使用 sails-mysql 适配器)。 - Alexis N-o
1个回答

10

你只需要像这样通过逗号分隔你的关联即可:

localhost:1337/tickets?populate=comments,owner&SOME_OTHER_PARAMS

对我来说似乎不起作用。但如果我查看单个记录,它是有效的:tickets/123?populate=comments - schystz
2
这是错误的。应该是类似于 localhost:1337/tickets?populate=[comments,owner]&SOME_OTHER_PARAMS 的东西。 - Phil
@philip,也许在新版本中有所改变。 - Moe Far
你们用的是哪个版本? - nbkhope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接