2017-02-01 6 views
6

जब मैं एक नेस्टेड मॉडल शामिल करने के लिए क्वेरी करता हूं - उदा। GET /api/Widgets/1?filter={include: {"foos": "bars"}} - मुझे अपने परिणामों में डुप्लिकेट foos मिलता है। मैंने सोचा कि यह एक बाएं जॉइन या ऐसा कुछ था, क्योंकि मैं MySQL का उपयोग कर रहा हूं, लेकिन जब मैं loopback:connector:mysql डीबग मोड में लूपबैक चलाता हूं, तो मैं देख सकता हूं कि प्रारंभिक विजेट के लिए क्वेरी एक बार चलती है, लेकिन यह क्वेरी foo दो बार चलता है, और बार के लिए क्वेरी दो बार चलता है। यह व्यवहार क्यों हो रहा है, और मैं क्या बदल सकता हूं (मेरे मॉडल, मेरा कोड या मेरी अपेक्षाएं)?लूपबैक में यह घोंसला वाला संबंध डुप्लिकेट परिणाम क्यों लौटा रहा है?

मॉडल:

{ 
    "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 
     } 
     ] 
    } 
    ] 
} 

यह एसक्यूएल दूसरे शब्दों में बयान कर रहा है कि मैं इस अनुरोध के लिए किया जा रहा रन देखें:

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"}}) कार्यों का एक सर्वर साइड निष्पादन के लिए एक अनुरोध है। तो, फिलहाल मैं एक दूरस्थ विधि बनाउंगा जो यह करता है और शायद लूपबैक के साथ एक बग रिपोर्ट दर्ज करता है।

+1

यदि यह सर्वर-साइड निष्पादन पर ठीक काम करता है और आप केवल एपीआई कॉल के माध्यम से डुप्लिकेट प्राप्त करते हैं, तो हो सकता है कि [लूपबैक रूट] (https://loopback.io/doc/en/lb3/Routing] में कोई समस्या हो। एचटीएमएल); एक डबल मार्ग या कुछ घोंसले वाले मार्ग इस समस्या का कारण बन सकते हैं। –

+0

क्या आप इसे हल करते हैं? – Casy

+0

मेरा उत्तर देखें, @ कसी, अगर आपको एक समान समस्या का सामना करना पड़ रहा है तो यह आपको सही दिशा में इंगित करने में मदद कर सकता है। धन्यवाद क्रिस्टोस, जिसने मुझे इसे हल करने में मदद की। –

उत्तर

0

मैं this mixin कि एक परिभाषित पर अधिकतम करने के लिए एक प्रश्न बाहर की limit को सीमित करता है उपयोग कर रहा था मूल्य। जब include एक प्रश्न में मौजूद है, mixin भी की गुंजाइश पर एक सीमा निर्धारित करता है तो तरह शामिल हैं:

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

लगता mixin संभालने था सब शामिल कर रहे हैं वस्तुओं {"relation":"foo", "scope":{"include:"bars"}} के रूप में लिखा जाएगा कि ।

1

क्या आपने निम्न पंक्तियों को हटाने का प्रयास किया है? डिफ़ॉल्ट रूप से, यदि foreignKey सेट नहीं है, तो यह इसे <relationName>Id के रूप में सेट करेगा। लेकिन चूंकि आप इसे रिक्त स्थान पर सेट करते हैं, इसलिए लूपबैक किसी भी कॉलम को संदर्भित नहीं कर रहा है। इसलिए यह आपके संबंधित मॉडल पर सभी रिकॉर्ड प्राप्त कर रहा है।

{ 
    "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": "" // remove this 
    } 
    } 
} 

{ 
    "name": "Bar" 
    ... 
    "relations": { 
    "foo": { 
     "type": "belongsTo", 
     "model": "Foo", 
     "foreignKey": "" //remove this 
    } 
    } 
} 

अद्यतन:

इस तरह मैं 2 (या 3) स्तर संबंधों फोन:

/api/Widgets/1?filter={include: [{"relation":"foo", "scope":{"include:"bars"}}]} 
+0

यह कोई फर्क नहीं पड़ता है। डिफ़ॉल्ट विदेशी की गणना 'relationName +' Id'' के रूप में की जाती है चाहे रेखा खाली या छोड़ी गई हो। –

+0

ने मेरा जवाब अपडेट किया। जोड़ा गया कि मैं तीसरे स्तर के संबंधों को कैसे कॉल करता हूं। –

+1

यह सहायक है, मार्क। मेरा मानना ​​है कि मैं जिस मिश्रण का उपयोग कर रहा था, इस कारण यह मुद्दा माना गया था कि सभी बहु-स्तर के संबंध इस तरह परिभाषित किए गए थे। –

संबंधित मुद्दे