我有3个型号。 2个资源模型,account(id, name)
和widget(id, name)
,以及1个映射模型,用于在两个widget_to_account(id, account_id, widget_id)
之间进行映射,以告知帐户有权访问哪些小部件,可以这么说。
当使用http://loopback.io/doc/en/lb3/HasManyThrough-relations.html中的指南说明JSON中模型之间的关系时,例如“获取帐户id = 1的小部件”等RESTful请求可以很好地工作。
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
表并选择account_id=1
的条目,但有趣的是它停在那里并且只返回一个空小部件数组。
任何线索? 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"
}
}
这不是非常清楚,甚至在loopback api docs中声明不正确 -.-
答案 0 :(得分:9)
<强>更新强>
进行更多挖掘,我在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"
}
}
这不是非常清楚,甚至在loopback api文档中声明不正确。我希望他们能够停止这种他们一直在推动的“自动命名”范式。看看环回SO和更广泛的社区,它通常会导致模型被错误地命名,这样的键被设置为完全任意的名称--.-