2016-02-28 8 views
9

में संबंधित मॉडल से लाने मैं baffle.where({id: 1}).fetch() तरह हमेशा की तरह, baffle मॉडल का एक भाग के रूप में typeName विशेषता पाने के लिए baffleType से स्पष्ट रूप से हर बार प्राप्त करने में कठिनाई के बिना होगा।हमेशा Bookshelf.js

मेरे लिए निम्नलिखित काम करता है लेकिन ऐसा लगता है कि withRelated संबंधों लोड होगा अगर baffle मॉडल सीधे प्राप्त किए गए है, संबंध द्वारा नहीं:

let baffle = bookshelf.Model.extend({ 
    constructor: function() { 
     bookshelf.Model.apply(this, arguments); 

     this.on('fetching', function(model, attrs, options) { 
      options.withRelated = options.withRelated || []; 
      options.withRelated.push('type');   
     }); 
    }, 

    virtuals: { 
     typeName: { 
      get: function() { 
       return this.related('type').attributes.typeName; 
      } 
     } 
    }, 
    type: function() { 
     return this.belongsTo(baffleType, 'type_id'); 
    } 
}); 

let baffleType = bookshelf.Model.extend({}); 

ऐसा करने के लिए उचित तरीका क्या है?

उत्तर

3

यह प्रश्न बहुत पुराना है, लेकिन मैं वैसे भी जवाब दे रहा हूं।

मैंने इसे एक नया फ़ंक्शन, fetchFull जोड़कर हल किया, जो चीजों को बहुत शुष्क रखता है।

let MyBaseModel = bookshelf.Model.extend({ 
    fetchFull: function() { 
    let args; 
    if (this.constructor.withRelated) { 
     args = {withRelated: this.constructor.withRelated}; 
    } 
    return this.fetch(args); 
    }, 
}; 

let MyModel = MyBaseModel.extend({ 
    tableName: 'whatever', 
    }, { 
    withRelated: [ 
     'relation1', 
     'relation1.related2' 
    ] 
    } 
); 

तो जब भी आप की क्वेरी रहे हैं, आप Model.fetchFull() कॉल कर सकते हैं या तो सब कुछ लोड करने के लिए, या मामलों में आप किसी प्रदर्शन हिट लेने के लिए नहीं करना चाहती है, तो आप अभी भी Model.fetch() का सहारा कर सकते हैं।

+0

धन्यवाद, यह बहुत देर हो चुकी नहीं है। – estus

7

रेपो पर समस्या Fetched घटना से संबंधित है, हालांकि Fetching घटना ठीक काम कर रही है (v0.9.2)

तो बस उदाहरण के लिए आप की तरह

var Test = Bookshelf.model.extend({ 
    tableName : 'test', 
    baffleField : function(){ 
     return this.belongsTo(baffle) 
    } 
}) 

और उसके बाद एक 3 मॉडल Test.forge().fetch({ withRelated : ['baffleField']}) है, अवरोधक पर fetching ईवेंट सक्रिय जाएगी। हालांकि ORMtype (उप संबंधित मॉडल) को शामिल नहीं करेगा जब तक आप विशेष रूप से

Test.forge().fetch({ withRelated : ['baffleField.type']}) 

हालांकि मैं try to avoid इस अगर यह N QueryN records के लिए कर रहा है होगा ऐसा करने के लिए यह बताना।

अद्यतन 1

मैं एक ही बात है कि आप model.extend में

fetch: function fetch(options) { 
    var options = options || {} 
    options.withRelated = options.withRelated || []; 
    options.withRelated.push('type');  
    // Fetch uses all set attributes. 
    return this._doFetch(this.attributes, options); 
} 

तरह fetching घटना पर क्या कर रहे थे के बारे में बात कर रहा था। हालांकि आप देख सकते हैं, यह version परिवर्तनों में विफल हो सकता है।

+0

'fetching' पर अच्छा बिंदु, धन्यवाद। तो, अगर मैं व्यवसाय तर्क डीआरवाई रखना चाहता हूं और '{withRelated: ...} 'को सभी' fetch() 'कॉल पर छोड़ना चाहता हूं तो' विकल्प .withRelated' को एकमात्र विकल्प संशोधित कर रहा है? ऐप के इस हिस्से में प्रदर्शन महत्वपूर्ण नहीं है। – estus

+0

@estus मुझे लगता है हाँ। हालांकि मैं कुछ समय के लिए sequelize का उपयोग कर रहा हूँ, तो सुनिश्चित नहीं हो सकता है। वही काम करने का एक और तरीका '' '' overriding''' (जेएस के लिए एक अच्छा शब्द नहीं है) '' 'model.extend''' में लाने विधि। हालांकि '' 'fetching'' घटना के साथ काम करना इसे करने का एक बुकशेल्फ़ तरीका है। एक विधि को ओवरराइड करना एक क्लीनर तरीका है लेकिन यह संस्करण उन्नयन/डाउनग्रेड पर असफल हो सकता है। – Satyajeet

+0

ऐसा लगता है कि 'fetching' ट्रिगर किया गया है लेकिन जब कोई' संबंध 'के रूप में लोड किया जाता है तो कोई घोंसला संबंध लोड नहीं होता है, इसलिए प्रत्येक मूल मॉडल में' fetching' निर्दिष्ट किया जाना चाहिए। क्या आप कृपया 'fetch' ओवरराइड के लिए एक उदाहरण जोड़ सकते हैं? क्या यह कुछ लाने जैसा होना चाहिए: फ़ंक्शन (... तर्क) {वापसी bookshelf.Model.prototype.fetch.bind (यह) (... args)} '? – estus

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