Ассоциации Sequelize не работают, как исправить? - PullRequest
0 голосов
/ 04 февраля 2020

Я определил две модели: User и Bookmark

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    pass: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    User.hasMany(models.Bookmark)
  };
  return User
};

'use strict'
module.exports = (sequelize, DataTypes) => {
  const Bookmark = sequelize.define('Bookmark', {
    title: DataTypes.STRING,
    url: DataTypes.STRING
  }, {})
  Bookmark.associate = function (models) {
    // Bookmark.belongsTo(models.User)
  }
  return Bookmark
}

Функции associate вызываются с помощью стандартного кода, сгенерированного в models/index.js:

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

Однако есть две вещи, которые не происходят, и я ожидаю, что они должны:

User.findAll()
  .then(users => console.log(typeof users[0].getBookmarks))

Выше getBookmarks равно undefined.

И во-вторых, я не вижу, чтобы обновления схемы распространялись на база данных.

Я также попытался повторно активировать // Bookmark.belongsTo(models.User) из модели Bookmark, и ничего не изменилось.

Проблема и исправление

Оказывается, вам нужно явно вызвать sync для экземпляра Sequelize, и, если таблицы в ассоциации уже присутствует, вы должны включить аргумент {force: true} для сохранения связи с базой данных.

1 Ответ

1 голос
/ 04 февраля 2020

Чтобы получить связанный Bookmarks, который вы пропустили до include Bookmark при запросе User.

Включая Bookmark, запрос должен выглядеть следующим образом

User.findAll({
    include: [
        {
            model: Bookmark
        }      
    ]
}).then( users => {
    // you now get the `users`, with `bookmarks` associated with it.
});
...