【问题标题】:BookshelfJS - 'withRelated' through relational table returns empty resultsBookshelfJS - 通过关系表的“withRelated”返回空结果
【发布时间】:2019-10-10 12:08:04
【问题描述】:

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

我有一个 Sound 模型和一个 Keyword 模型,我想用多对多关系对其进行建模(每个 Sound 可以有多个关键字,并且每个关键字可以与多个声音相关)。根据文档,“.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 设置。

【问题讨论】:

    标签: orm knex.js bookshelf.js


    【解决方案1】:

    更新编辑:

    我从一开始就一直在使用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 和 .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');
      }
    });
    

    我确实尝试使用 soundIDkeywordId 而不是 'id'(如下所示)的原始代码,但没有 .through 关系并给出相同的空结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多