BookshelfJS-通过关系表的“ withRelated”返回空结果

时间:2019-05-23 21:44:01

标签: orm knex.js bookshelf.js

我一直在尝试在数据库中构建关系以提高查询效率和联接效率,但是在遵循'。belongsToMany''。through'的指南之后和'。belongsTo'我现在得到的结果是空的。

我有一个声音模型和一个关键字模型,我想用多对多关系进行建模(每个声音可以有多个关键字,并且每个关键字可以与多个声音相关联)。根据文档“ .belongsToMany”将成为此处使用的关系。

我已经使用“ sound_keyword”关系表/ SoundKeyword 关系模型(其中每个条目都有自己的唯一'id''soundID''keywordID'):

var Sound = bookshelf.Model.extend({
  tableName: 'sounds',
  keywords: function () {
    return this.belongsToMany(Keyword, 'sound_keyword', 'id', 'id').through(SoundKeyword, 'id', 'soundID');
  },
});

var Keyword = bookshelf.Model.extend({
  tableName: 'keywords',
  sounds: function () {
    return this.belongsToMany(Sound, 'sound_keyword', 'id', 'id').through(SoundKeyword, 'id', 'keywordID');
  }
});

其中:

var SoundKeyword = bookshelf.Model.extend({
    tableName: 'sound_keyword',
    sound: function () {
        return this.belongsTo(Sound, 'soundID');
    },
    keyword: function () {
        return this.belongsTo(Keyword, 'keywordID');
    }
});

从我在文档和BookshelfJS GitHub页面上阅读的内容来看,以上似乎是正确的。尽管如此,当我运行 以下查询 时,我得到了一个空结果集(有问题的声音与数据库中的3个关键字相关):

var results = await Sound
    .where('id', soundID)
    .fetch({
        withRelated: ['keywords']
    })
    .then((result) => {
        console.log(JSON.stringify(result.related('keywords')));
    })

我在哪里出错呢?关系建立不正确吗(可能是错误的外键?)?我提取的模型不正确吗?

很高兴根据需要提供Knex设置。

1 个答案:

答案 0 :(得分:0)

更新后的编辑:

我从一开始就一直使用Model-Registry Plugin,却忘记了它。事实证明,虽然以下语法是正确的,但它更喜欢类似于以下内容的语法(即小写的“模型”,删除“ .extends”并将模型名称放在引号中):

var Sound = bookshelf.model('Sound',{
  tableName: 'sounds',
  keywords: function () {
    return this.belongsToMany('Keyword', 'sound_keyword', 'soundID', 'keywordID');
  },
});

var Keyword = bookshelf.model('Keyword',{
  tableName: 'keywords',
  sounds: function () {
    return this.belongsToMany('Sound', 'sound_keyword', 'keywordID', 'soundID');
  }
});

希望这对其他人有帮助。

看起来就像删除'.through'关系并在'.belongsToMany'调用中更改ID一样(如下所示),尽管我不确定为什么(文档似乎暗示 belongsToMany < / em>和。 through 协同工作-可能多余吗?)

var Sound = bookshelf.Model.extend({
  tableName: 'sounds',
keywords: function () {
    return this.belongsToMany(Keyword, 'sound_keyword', 'soundID', 'keywordID');
  },
});

var Keyword = bookshelf.Model.extend({
  tableName: 'keywords',
  sounds: function () {
    return this.belongsToMany(Sound, 'sound_keyword', 'keywordID', 'soundID');
  }
});

我确实尝试使用 soundID keywordId 代替“ id ”(如下所示)使用原始代码,但没有 .through 关系,并且得到相同的空结果。