BookshelfJS - withRelated через реляционную таблицу возвращает пустые результаты - PullRequest
0 голосов
/ 24 мая 2019

Я пытался структурировать отношения в своей базе данных для более эффективных запросов и объединений, но после следования инструкциям для '. AssignToMany' , '. Through' и '. OwnTo' Теперь я получаю пустые результаты.

У меня есть модель Sound и модель Keyword , которую я хочумодель с отношением «многие ко многим» (каждый звук может иметь несколько ключевых слов, а каждое ключевое слово может быть связано с несколькими звуками).На основе документации '.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 голосов
/ 25 мая 2019

ОБНОВЛЕНИЕ РЕДАКТИРОВАНИЯ:

Я использовал плагин Model-Registry с самого начала и забыл об этом. Как оказалось, хотя приведенный ниже синтаксис является правильным, он предпочитает синтаксис, подобный следующему (то есть строчная «модель», отбрасывая «.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» сделали свое дело (как показано ниже), хотя я не совсем уверен, почему (документы, похоже, подразумевают ownToMany *) 1013 * и. - хорошо работают вместе - возможно, избыточны?)

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 отношение и это дало те же пустые результаты.

...