ネストされたモデルを含めるようにクエリするとGET /api/Widgets/1?filter={include: {"foos": "bars"}}
- 私の結果にはfoos
が重複しています。私はこれがLEFT JOINなどのものだと思っていましたが、MySQLを使用しているので、loopback:connector:mysql
デバッグモードでLoopBackを実行すると、最初のウィジェットのクエリは一度実行されますが、 fooは2回実行され、barのクエリは2回実行されます。なぜこの現象が発生していますか(私のモデル、私のコード、または私の期待)を変更することはできますか?LoopBackでこのネストされた関係が重複した結果を返すのはなぜですか?
モデル:期待
{
id: 1
foos: [
{
id: 2,
bars: [
{
id: 3
}
]
},
{
id: 2,
bars: [
{
id: 3
}
]
}
]
}
:
{
"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": ""
}
}
}
結果。これは、SQLを言い換えている
{
id: 1
foos: [
{
id: 2,
bars: [
{
id: 3
}
]
}
]
}
私は、この要求のためのものの実行を参照してください。
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`
私はループバック3.xを使用しています。
更新:GET /api/Widgets/1?filter={include: {"foos": "bars"}}
展示この動作、完全にWidgets.findById(id, {include: {"foos": "bars"}})
作品のサーバ側の実行の要求をしながら。ですから、現時点ではこれを行うリモートメソッドを作成し、おそらくLoopBackでバグレポートを提出します。
サーバー側の実行で正常に動作し、API呼び出しで重複が発生する場合は、[Loopback routes](https://loopback.io/doc/en/lb3/Routing)に問題がある可能性があります。 html);二重ルートまたはいくつかのネストされたルートがこの問題を引き起こす可能性があります。 –
あなたはそれを解決しますか? – Casy
似たような問題が発生している場合は、私の答え、@Casyを参照してください。ありがとうChristos、それは私がそれを整理するのに役立ちました。 –