始终从Bookshelf.js中的相关模型中获取

时间:2016-02-28 07:21:03

标签: node.js bookshelf.js knex.js

我希望baffle.where({id: 1}).fetch()始终将typeName属性作为baffle模型的一部分,而不是每次都明确地从baffleType获取它。

以下对我有用,但似乎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({});

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:8)

回购问题与Fetched事件有关,但Fetching事件工作正常(v0.9.2)

所以,例如,如果您有第三个模型,如

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

然后执行Test.forge().fetch({ withRelated : ['baffleField']}),挡板上的fetching事件将会触发。但是,ORM不会包含type(子相关模型),除非您明确告诉它

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

但如果try to avoid N Query N records,我会fetching。{/ p>

更新1

我在谈论你在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); } 事件中所做的同样的事情,比如

model.extend
version中的

。但是正如您所看到的,</license> <parameters pca-dim="32"/> <parameters resize_minpix="100000" npix="100000" ptch="24" step="4" nscale="5" maxscale="4"/> <parameters notify-classes-removed="1"/> <parameters grid-regions="1x1,1x3"/> <feature_extractions> <feature_extraction id="orh" params="8,4:0.7,0.5:0.4,0.6:0.01"/> <feature_extraction id="col" params="4:mv:0.4,0.6:0.01"/> </feature_extractions> <vocabulary rebuild="IfDoesNotExist" gmm-iter="8" sig-norm-type="l2" sig-norm-pow="0.5"/> <classifier type="sgd" lambda="1.0E-5" max-iterations="20"/> <validation name="V1CrossValidation" folds="5" mode="fast" method="modulo" result-file="/opt/ADL_db/Users/mkhalil/CshellTest/ScriptTests/temp/V1CrossValidation-results.stats" score-flags="combine,normalize"/> 更改可能会失败。

答案 1 :(得分:4)

这个问题已经超级老了,但无论如何我都在回答。

我通过添加一个新功能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()