Bookshelf js fetchAll withRelated选项返回空关系对象

时间:2016-02-16 19:15:27

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

当我.fetchAll({ withRelated: 'backfire' });时,我的输出结果中出现了一个名为backfire的属性,其值为{}。在knex调试模式下,我清楚地看到select "backfire".* from "backfire" where "backfire"."id" in (?);在复制/粘贴到sqlite3控制台时有效(当然在输入有效的ID之后)。所以我知道我的模型必须有点正确。

Knex Migration

exports.up = function(knex, Promise) {
  return knex.schema.createTable("backfire", function(table) {
    table.increments("id").primary();
    table.string("response").notNullable();
    table.string("created_by").notNullable();
    table.timestamps();
}).then(function(){
        return knex.schema.createTable("backfireTrigger", function(table) {
            table.increments("id").primary();
            table.string("trigger").notNullable();
            table.integer("backfire_id").unsigned().notNullable().references("id").inTable("backfire");
            table.string("created_by").notNullable();
            table.timestamps();
        });
    });
};

Models.js

module.exports = function(bookshelf) {

var Backfire = bookshelf.Model.extend({
    tableName: 'backfire',
    backfireTriggers: function() {
      return this.hasMany(BackfireTrigger);
    }
});

var BackfireTrigger = bookshelf.Model.extend({
    tableName: 'backfireTrigger',
    backfire: function() {
      return this.belongsTo(Backfire);
    }
});

return {
  Backfire: Backfire,
  BackfireTrigger: BackfireTrigger
};

}

我的用法

function getAllTriggers() {
    var self = this;
    return new self.models.BackfireTrigger()
    .fetchAll({
        withRelated: ['backfire']
    });
}

2 个答案:

答案 0 :(得分:1)

查看文档时,似乎“withRelated”字段不是model.fetchAll的选项,也不是model.fetch的选项。我自己也遇到过这个问题。如果使用debug:true运行knex,您可以看到它只会查询您正在获取的表,而不是查询关系。

http://bookshelfjs.org/#Model-instance-fetchAll

答案 1 :(得分:1)

我自己是Bookshelf.js的新手,但我想,这可以通过Collectionshttp://bookshelfjs.org/#Collection)来实现。

var BackfireTriggers = bookshelf.Collection.extend({
    model: BackfireTrigger
});

BackfireTriggers.forge().fetch({ withRelated: 'backfire' }).then(…);