环回 "Include" 过滤器因 hasManyThrough 关系而失败
Loopback "Include" Filter Fails with hasManyThrough Relation
我有 3 个模型。 2 个资源模型,account(id, name)
和 widget(id, name)
,以及 1 个在两者之间映射的映射模型 widget_to_account(id, account_id, widget_id)
,可以说是告诉一个帐户可以访问哪些小部件。
在 JSON 中说明模型之间的关系时,使用 http://loopback.io/doc/en/lb3/HasManyThrough-relations.html 中的指南,RESTful 请求(例如 "get widgets of account id=1")非常有效。
GET /accounts/1/widgets
生成账户 1 拥有的小部件,生成一个小部件数组:
[
{
"id": 1,
"name": "wg_user_mgr"
},
{
"id": 2,
"name": "wg_desc"
}
]
一切都很好。
但是,假设我想将此小部件数组结果与 GET 返回的帐户对象一起附加到 account
模型? Loopback 文档建议这是通过在请求中使用 include
关键字来完成的,如下所示:
GET /accounts/1?filter[include]=widgets
,希望返回一个 account
模型及其允许的小部件:
{
"id": 1,
"name": "Account1Name",
"widgets": [
{
"id": 1,
"name": "wg_user_mgr",
"display_name": "User Manager"
},
{
"id": 2,
"name": "wg_desc",
"display_name": "Description"
}
]
}
然而,回环实际返回的请求是:
{
"id": 1,
"name": "Account1Name",
"widgets": []
}
清空小部件数组!当我查看环回 SQL 调试时,我看到它 确实 转到 widget_to_account
table 并选择 [=25= 的条目],但有趣的是它停在那里,只是 returns 一个空的小部件数组。
有什么线索吗? hasManyThrough
环回文档实际上没有显示任何使用 include
来桥接通过映射模型连接的两个模型的示例。
我猜他们只是忘了将其编码为¯\_(ツ)_/¯
更新:
进一步挖掘后,我在 https://groups.google.com/forum/#!topic/loopbackjs/sH7bKoqzU5c 找到了答案。
在 2 个资源模型中定义关系的地方,必须专门定义 "keyThrough" 值。
不是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account"
}
}
但是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account",
"keyThrough": "account_id"
}
}
这不是很清楚,甚至在环回 api 文档 -.-
中 错误地 陈述
更新:
进一步挖掘后,我在 https://groups.google.com/forum/#!topic/loopbackjs/sH7bKoqzU5c 找到了答案。
在 2 个资源模型中定义关系的地方,您必须专门定义 "keyThrough" 值。
不是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account"
}
}
但是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account",
"keyThrough": "widget_id"
}
}
这不是很清楚,甚至在环回 api 文档中 错误地 陈述。我希望他们能停止这种他们一直在推动的 "auto-naming" 模式。看看 loopback SO 和更广泛的社区,模型命名不正确通常会造成很多痛苦,像这样的键被设置为完全任意的名称 -.-
我有 3 个模型。 2 个资源模型,account(id, name)
和 widget(id, name)
,以及 1 个在两者之间映射的映射模型 widget_to_account(id, account_id, widget_id)
,可以说是告诉一个帐户可以访问哪些小部件。
在 JSON 中说明模型之间的关系时,使用 http://loopback.io/doc/en/lb3/HasManyThrough-relations.html 中的指南,RESTful 请求(例如 "get widgets of account id=1")非常有效。
GET /accounts/1/widgets
生成账户 1 拥有的小部件,生成一个小部件数组:
[
{
"id": 1,
"name": "wg_user_mgr"
},
{
"id": 2,
"name": "wg_desc"
}
]
一切都很好。
但是,假设我想将此小部件数组结果与 GET 返回的帐户对象一起附加到 account
模型? Loopback 文档建议这是通过在请求中使用 include
关键字来完成的,如下所示:
GET /accounts/1?filter[include]=widgets
,希望返回一个 account
模型及其允许的小部件:
{
"id": 1,
"name": "Account1Name",
"widgets": [
{
"id": 1,
"name": "wg_user_mgr",
"display_name": "User Manager"
},
{
"id": 2,
"name": "wg_desc",
"display_name": "Description"
}
]
}
然而,回环实际返回的请求是:
{
"id": 1,
"name": "Account1Name",
"widgets": []
}
清空小部件数组!当我查看环回 SQL 调试时,我看到它 确实 转到 widget_to_account
table 并选择 [=25= 的条目],但有趣的是它停在那里,只是 returns 一个空的小部件数组。
有什么线索吗? hasManyThrough
环回文档实际上没有显示任何使用 include
来桥接通过映射模型连接的两个模型的示例。
我猜他们只是忘了将其编码为¯\_(ツ)_/¯
更新:
进一步挖掘后,我在 https://groups.google.com/forum/#!topic/loopbackjs/sH7bKoqzU5c 找到了答案。
在 2 个资源模型中定义关系的地方,必须专门定义 "keyThrough" 值。
不是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account"
}
}
但是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account",
"keyThrough": "account_id"
}
}
这不是很清楚,甚至在环回 api 文档 -.-
中 错误地 陈述更新:
进一步挖掘后,我在 https://groups.google.com/forum/#!topic/loopbackjs/sH7bKoqzU5c 找到了答案。
在 2 个资源模型中定义关系的地方,您必须专门定义 "keyThrough" 值。
不是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account"
}
}
但是这个:
"relations": {
"widgets": {
"type": "hasMany",
"model": "widget",
"foreignKey": "account_id",
"through": "widget_to_account",
"keyThrough": "widget_id"
}
}
这不是很清楚,甚至在环回 api 文档中 错误地 陈述。我希望他们能停止这种他们一直在推动的 "auto-naming" 模式。看看 loopback SO 和更广泛的社区,模型命名不正确通常会造成很多痛苦,像这样的键被设置为完全任意的名称 -.-