我希望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({});
这样做的正确方法是什么?
最佳答案
这个问题太老了,但我还是要回答。
我通过添加一个新函数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()
。