代码之家  ›  专栏  ›  技术社区  ›  Radu Stoenescu

续集关联不起作用,如何修复?

  •  0
  • Radu Stoenescu  · 技术社区  · 6 年前

    我定义了两个模型: 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) 从书签模型中,没有任何更改。

    问题和解决方法

    事实证明,你必须明确地打电话给 sync 在 Sequelize 实例,如果关联中的表已经存在,则必须包含参数 {force: true} 用于将关联持久化到数据库。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Ratul Sharker    6 年前

    获取相关信息 Bookmarks 你错过了 include Bookmark 在查询 User .

    包括…在内 书签 查询应该如下所示

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