我希望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({});
这样做的正确方法是什么?
答案 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()
。