- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我查询包含嵌套模型时 – 例如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/
我是一名优秀的程序员,十分优秀!