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

qxgroojn  于 2023-04-20  发布在  Node.js
关注(0)|答案(3)|浏览(108)

当我使用.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']
    });
}
fnvucqvd

fnvucqvd1#

查看文档,似乎“withRelated”字段不是model.fetchAll的选项,因为它是model.fetch的选项。我自己也遇到了这个问题。如果你在调试时运行knex:你可以看到它只查询你正在获取的表,而不是关系。
http://bookshelfjs.org/#Model-instance-fetchAll

xpcnnkqh

xpcnnkqh2#

我自己是Bookshelf.js的新手,但我认为,这可以通过使用Collections(http://bookshelfjs.org/#Collection)来实现。

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

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

t3psigkw3#

首先是好消息:我可以确认这适用于Bookshelf 1.2.0:

let result = await models.packages
    .fetchAll({
      require:     false,
      columns:     [
          'packages.id',
          'packages.name',
      ],
      withRelated: [
        'packageCollections',
      ],
      debug:       false,
    });

坏消息是这个库的文档不是很好。2这种行为与文档相矛盾。
另一个很大的问题,浪费了我很多时间:这个ORM在JavaScript进程本身中进行相关实体的连接,而不是通过使用SQL连接。因此,如果您不包括用于任何类型连接的主键列或外键列,则根本不会获得相关的相关数据。

不会有任何错误或警告-当然。你只会想知道,到底发生了什么?所以,是的,确保你包括相关的ID。

如果可以的话,请使用不同的ORM。

相关问题