2016-02-28 13 views
9

ich baffle.where({id: 1}).fetch() möchte immer typeName Attribut als Teil baffle Modell erhalten, ohne dass es von baffleType ausdrücklich jeder Zeit abgerufen werden.holen immer aus verwandten Modelle in Bookshelf.js

Die für mich folgende Werke, aber es scheint, dass withRelated Beziehungen laden, wenn baffle Modell direkt abgerufen wird, nicht durch die Beziehung:

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({}); 

Was ist der richtige Weg ist, das zu tun?

Antwort

3

Diese Frage ist super alt, aber ich antworte trotzdem.

Ich löste dies, indem ich nur eine neue Funktion, fetchFull, die Dinge ziemlich trocken hält.

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' 
    ] 
    } 
); 

Dann, wenn Sie die Abfrage, können Sie entweder Model.fetchFull() rufen alles zu laden, oder in Fällen, in denen Sie nicht wollen, eine Performance-Einbußen nehmen, können Sie immer noch zu Model.fetch() greifen.

+0

Danke, es ist nie zu spät. – estus

7

Ausgabe auf Repo bezieht sich auf Fetched Ereignis, jedoch Fetching Ereignis funktioniert gut (v0.9.2).

nur zum Beispiel Also, wenn Sie ein drittes Modell wie

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

und sie dann Test.forge().fetch({ withRelated : ['baffleField']}) wird fetching Ereignis auf Leitblech abzufeuern. Allerdings wird ORM nicht type (sub Verwandte Modell) enthalten, wenn Sie speziell sagen, es so von

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

zu tun, aber ich würde try to avoid dies, wenn es macht N Query für N records.

UPDATE 1

Ich sprach über gleiche Sache, die Sie auf fetching Ereignis

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); 
} 

in model.extend wie

taten. Wie Sie jedoch sehen können, kann dies bei version Änderungen fehlschlagen.

+0

Guter Punkt auf "holen", danke. Also, ist das Ändern von 'options.withRelated' die einzige Option hier, wenn ich die Geschäftslogik DRY behalten und' {withRelated: ...} 'part auf allen' fetch() 'calls überspringen will? Die Leistung ist in diesem Teil der App nicht kritisch. – estus

+0

@estus Ich denke ja. Allerdings habe ich Sequelize für einige Zeit verwendet, so kann ich nicht sicher sein. Eine andere Möglichkeit, das gleiche zu tun, ist die Methode '' '' '' '' '' '' '' '' ''(kein gutes Wort für JS), die in'' 'model.extend''' abgerufen wird. Die Arbeit mit dem '' fetching''' Event ist jedoch eher eine Art Bücherregal. Das Überschreiben einer Methode ist ein saubererer Weg, kann jedoch bei Upgrades/Downgrades von Versionen fehlschlagen. – Satyajeet

+0

Es sieht so aus, als ob 'fetching' ausgelöst wird, aber keine verschachtelten Relationen geladen werden, wenn 'baffle' als Relation geladen ist, daher sollte' fetching' in jedem Elternmodell angegeben werden. Könnten Sie bitte ein Beispiel für das Überschreiben von 'fetch' hinzufügen? Sollte es etwas wie 'fetch: function (... args) {return bookshelf.Model.prototype.fetch.bind (this) (... args)}'? – estus

Verwandte Themen