我希望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()

10-07 18:06