gpt4 book ai didi

loopbackjs - 为什么 LoopBack 中的嵌套关​​系返回重复结果?

转载 作者:行者123 更新时间:2023-12-02 20:23:40 27 4
gpt4 key购买 nike

当我查询包含嵌套模型时 – 例如GET/api/Widgets/1?filter={include: {"foos": "bars"}} – 我的结果中出现重复的 foos 。我认为这是由于 LEFT JOIN 或类似的原因,因为我使用的是 MySQL,但是当我在 loopback:connector:mysql Debug模式下运行 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 提交错误报告。

最佳答案

我正在使用this mixin将查询的limit限制为定义值的最大值。当查询中存在 include 时,mixin 还会对 include 的范围设置限制,如下所示:

"include": {"foo":"bar","scope":{"limit":1}}

似乎 mixin 假设所有对象的包含都将以 {"relation":"foo", "scope":{"include:"bars"}} 的形式编写,因此包含内容被添加了两次。

就其值(value)而言,我编写了这个简单的 mixin 来限制结果的最大数量,除非指定并停止使用上面链接的结果:

common/models/model.json:

"mixins": {
"ResultsetLimit": {
"limit": 100
}
}

common/mixins/resultset-limit.js:

const _ = require('lodash');

module.exports = (Model, options) => {

/**
* Modify incoming query to apply appropriate limit filters.
*/
Model.beforeRemote('**', (ctx, unused, next) => {

// Get the limit from the request, defaulting to the max limit.
const request_limit = _.toNumber(_.get(ctx, 'args.filter.limit', options.limit));

// Set the limit.
_.set(ctx, 'args.filter.limit', request_limit);

next();

});

};

关于loopbackjs - 为什么 LoopBack 中的嵌套关​​系返回重复结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41990542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com