当我使用.fetchAll({ withRelated: 'backfire' });
时,我在输出中得到了一个名为backfire的属性,其值为{}。在knex调试模式下,我清楚地看到select "backfire".* from "backfire" where "backfire"."id" in (?);
在复制/粘贴到sqlite3控制台时工作(当然是在输入有效ID之后)。所以我知道我的模型一定是正确的。
Knex迁移
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']
});
}
3条答案
按热度按时间fnvucqvd1#
查看文档,似乎“withRelated”字段不是model.fetchAll的选项,因为它是model.fetch的选项。我自己也遇到了这个问题。如果你在调试时运行knex:你可以看到它只查询你正在获取的表,而不是关系。
http://bookshelfjs.org/#Model-instance-fetchAll
xpcnnkqh2#
我自己是Bookshelf.js的新手,但我认为,这可以通过使用
Collections
(http://bookshelfjs.org/#Collection)来实现。t3psigkw3#
首先是好消息:我可以确认这适用于Bookshelf 1.2.0:
坏消息是这个库的文档不是很好。2这种行为与文档相矛盾。
另一个很大的问题,浪费了我很多时间:这个ORM在JavaScript进程本身中进行相关实体的连接,而不是通过使用SQL连接。因此,如果您不包括用于任何类型连接的主键列或外键列,则根本不会获得相关的相关数据。
不会有任何错误或警告-当然。你只会想知道,到底发生了什么?所以,是的,确保你包括相关的ID。
如果可以的话,请使用不同的ORM。