Sequelize.js 如何将关联方法从Sequelize 3.x升级到4.x?

Sequelize.js 如何将关联方法从Sequelize 3.x升级到4.x?,sequelize.js,Sequelize.js,我刚刚从Sequelize 3.x升级到4.x,我试图克制自己,不让自己沮丧地扯掉头上的所有头发 下面是: 在版本3及以下版本中,当关联模型时,我们将创建类似以下内容的模块文件: [文件[项目根目录]/models/user.js] module.exports = function ( db, Sequelize ) { let User = db.define ( 'user', { user_id: { primaryKey: true,

我刚刚从Sequelize 3.x升级到4.x,我试图克制自己,不让自己沮丧地扯掉头上的所有头发

下面是: 在版本3及以下版本中,当关联模型时,我们将创建类似以下内容的模块文件:

[文件
[项目根目录]/models/user.js
]

module.exports = function ( db, Sequelize ) {
    let User = db.define ( 'user', {
        user_id: {
            primaryKey: true,
            autoIncrement: true,
            type: Sequelize.INTEGER.UNSIGNED
        },
        company_id: {
            type: Sequelize.INTEGER.UNSIGNED,
            allowNull: false
        },
        created_at: {
            type: Sequelize.DATE,
            allowNull: false,
            defaultValue: Sequelize.NOW
        }
    }, {
        classMethods: {
            associate: function ( models ) {
                User.hasOne ( models.company, { as: 'company', foreignKey: 'company_id' });
            }
        }
    });
    return User;
};
现在,对于版本4()
classMethods
的“升级”已经被删除,这使我无法引用外部模型

有没有人能够弄明白如何在Sequelize v4.x中正确构建和维护关联


注意:我已尝试从他们的文档中添加指定的方法,但不起作用:

// model declaration code...
User.associate = function ( models ) {
    User.hasOne ( models.company, ... );
};


附加说明:是的,我的所有依赖项都已安装并正常工作。我的[file
[project root]/models/index.js
]正确地拉入了我的所有模型。只有关联/外键没有被创建。

我知道您说它不起作用,但是使用v4+以下方法确实起作用

// Class Method
Model.associate = function (models) {
    ...associate the models
};
编辑:为了证明,我完全遵循了你的代码。假设您正在使用mysql

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('uzer', {
    user_id: {
      primaryKey: true,
      autoIncrement: true,
      type: DataTypes.INTEGER.UNSIGNED
    },
    company_id: {
      allowNull: false,
      type: DataTypes.INTEGER.UNSIGNED
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW
    }
  });

  User.associate = function (models) {
    User.hasOne(models.company, {
      foreignKey: 'company_id',
      as: 'company',
    });
  };

  return User;
};
你没有提供公司模型,但我认为是这样的

module.exports = (sequelize, DataTypes) => {
  const Company = sequelize.define('company', {
    name: {
      type: DataTypes.STRING
    }
  });

  return Company;
};
这将生成SQL

Executing (default): CREATE TABLE IF NOT EXISTS `uzers` (`user_id` INTEGER UNSIGNED auto_increment , `company_id` INTEGER UNSIGNED NOT NULL, `created_at` DATETIME NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB;

Executing (default): CREATE TABLE IF NOT EXISTS `companies` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `company_id` INTEGER UNSIGNED, PRIMARY KEY (`id`), FOREIGN KEY (`company_id`) REFERENCES `uzers` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
然后给出数据库表

并列出参考资料


我知道您说它不起作用,但是使用v4+以下功能确实起作用

// Class Method
Model.associate = function (models) {
    ...associate the models
};
编辑:为了证明,我完全遵循了你的代码。假设您正在使用mysql

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('uzer', {
    user_id: {
      primaryKey: true,
      autoIncrement: true,
      type: DataTypes.INTEGER.UNSIGNED
    },
    company_id: {
      allowNull: false,
      type: DataTypes.INTEGER.UNSIGNED
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW
    }
  });

  User.associate = function (models) {
    User.hasOne(models.company, {
      foreignKey: 'company_id',
      as: 'company',
    });
  };

  return User;
};
你没有提供公司模型,但我认为是这样的

module.exports = (sequelize, DataTypes) => {
  const Company = sequelize.define('company', {
    name: {
      type: DataTypes.STRING
    }
  });

  return Company;
};
这将生成SQL

Executing (default): CREATE TABLE IF NOT EXISTS `uzers` (`user_id` INTEGER UNSIGNED auto_increment , `company_id` INTEGER UNSIGNED NOT NULL, `created_at` DATETIME NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB;

Executing (default): CREATE TABLE IF NOT EXISTS `companies` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `company_id` INTEGER UNSIGNED, PRIMARY KEY (`id`), FOREIGN KEY (`company_id`) REFERENCES `uzers` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=InnoDB;
然后给出数据库表

并列出参考资料


不确定重复那些显然不起作用的内容会有什么帮助。除非
Model
指向的变量不是问题代码中声明的
用户
变量。请把你的答案说清楚。谢谢。这有点粗鲁,因为我是想帮忙。然而,我已经更新了我的答案来证明。我也是sequelize的一名撰稿人,所以如果你发现一个bug,请告诉我,我不是故意粗鲁的。我设置了一个指向现有配置的新模型文件夹,它现在也可以工作了。可能是一些新升级不喜欢的旧代码,所以看起来我需要从头重写所有的项目模型。谢谢你的回答。然而,与其复制/粘贴问题中链接的官方文件,不如试着提出您的想法,说明为什么某些东西在特定问题上可能不起作用。无论如何,非常感谢您花时间回复!不确定如何重复显然不起作用的内容会有帮助。除非
Model
应该指向问题代码中声明的
User
变量以外的变量。请把你的答案说清楚。谢谢。这有点粗鲁,因为我是想帮忙。然而,我已经更新了我的答案来证明。我也是sequelize的一名撰稿人,所以如果你发现一个bug,请告诉我,我不是故意粗鲁的。我设置了一个指向现有配置的新模型文件夹,它现在也可以工作了。可能是一些新升级不喜欢的旧代码,所以看起来我需要从头重写所有的项目模型。谢谢你的回答。然而,与其复制/粘贴问题中链接的官方文件,不如试着提出您的想法,说明为什么某些东西在特定问题上可能不起作用。无论如何,非常感谢您花时间回复!