【发布时间】:2019-01-24 03:48:09
【问题描述】:
当我查询包含嵌套模型时 - 例如GET /api/Widgets/1?filter={include: {"foos": "bars"}} - 我的结果中有重复的 foos。我认为这是由于 LEFT JOIN 或类似的原因,因为我正在使用 MySQL,但是当我在 loopback:connector:mysql 调试模式下运行 LoopBack 时,我可以看到初始小部件的查询运行一次,但是对 foo 的查询运行两次,对 bar 的查询运行两次。为什么会发生这种行为,我可以改变什么(我的模型、我的代码或我的期望)?
型号:
{
"name": "Widget",
...
"relations": {
"foos": {
"type": "hasMany",
"model": "Foo",
"foreignKey": "widgetId"
}
}
}
{
"name": "Foo",
...
"relations": {
"bars": {
"type": "hasMany",
"model": "Bar",
"foreignKey": "fooId"
},
"widget": {
"type": "belongsTo",
"model": "Widget",
"foreignKey": ""
}
}
}
{
"name": "Bar"
...
"relations": {
"foo": {
"type": "belongsTo",
"model": "Foo",
"foreignKey": ""
}
}
}
结果:
{
id: 1
foos: [
{
id: 2,
bars: [
{
id: 3
}
]
},
{
id: 2,
bars: [
{
id: 3
}
]
}
]
}
期待:
{
id: 1
foos: [
{
id: 2,
bars: [
{
id: 3
}
]
}
]
}
这是我看到正在为此请求运行的转述 SQL:
SELECT `...` FROM `Widget` WHERE `id`=1 ORDER BY `id` LIMIT 1
SELECT `...` FROM `Foo` WHERE `widget_id` IN (1) ORDER BY `id`
SELECT `...` FROM `Foo` WHERE `widget_id` IN (1) ORDER BY `id`
SELECT `...` FROM `Bar` WHERE `foo_id` IN (2) ORDER BY `id`
SELECT `...` FROM `Bar` WHERE `foo_id` IN (2) ORDER BY `id`
我正在使用 Loopback 3.x。
更新:虽然GET /api/Widgets/1?filter={include: {"foos": "bars"}} 的请求表现出这种行为,但Widgets.findById(id, {include: {"foos": "bars"}}) 的服务器端执行却可以完美运行。因此,目前我将创建一个远程方法来执行此操作,并可能使用 LoopBack 提交错误报告。
【问题讨论】:
-
如果它在服务器端执行时运行良好,而您只是通过 API 调用获得了重复,那么可能是 Loopback routes 存在问题;双路由或某些嵌套路由可能会导致此问题。
-
你解决了吗?
-
查看我的回答,@Casy,如果您遇到类似问题,它可能会帮助您指出正确的方向。谢谢克里斯托斯,这帮助我解决了问题。
标签: loopbackjs