尽管要完成一个简单的任务,但文档似乎并没有使人感到困惑。
我有以下模型和迁移-为了使最简单的示例正常工作,我现在减少了属性,但是我确实打算对这些模型/迁移有更多的了解:
用户模型
class User extends Model {
static init(sequelize) {
return super.init(
{
user_id: {
type: DataTypes.STRING,
primaryKey: true,
allowNull: false,
autIncrement: false
},
{
sequelize,
timestamps: true,
modelName: "User",
tableName: "Users"
}
);
}
}
module.exports = User;
用户迁移
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
user_id: {
allowNull: false,
primaryKey: true,
type: Sequelize.STRING,
},
createdAt: {
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
type: Sequelize.DATE,
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Users');
},
};
工具型号
const { Model, DataTypes } = require('sequelize');
class Tool extends Model {
static init(sequelize) {
return super.init(
{
tool_id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autIncrement: true,
},
name: DataTypes.STRING,
}, {
sequelize,
timestamps: true,
modelName: 'Tool',
tableName: 'Tools'
}
);
}
static associate(models) {
this.belongsToMany(models.User, { as: 'tools', through: 'UserTools' });
}
}
module.exports = Tool;
工具迁移
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Tools', {
tool_id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
},
name: {
type: Sequelize.STRING,
},
createdAt: {
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Tools');
}
};
UserTools模型(缺少fk引用,因为关联应将它们放在模型上?)
class UserTools extends Model {
static init(sequelize) {
return super.init(
{
quantity: DataTypes.INTEGER,
uses: {
type: DataTypes.INTEGER,
defaultValue: 0,
},
}, {
sequelize,
timestamps: true,
modelName: 'UserTools',
tableName: 'UserTools'
}
)
}
}
UserTools迁移
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
console.log("SEQUELIZE: ", Sequelize);
return queryInterface.createTable('UserTools', {
user_id: {
allowNull: false,
foreignKey: true,
autoIncrement: false,
references: {
model: 'Users',
key: 'user_id',
},
type: Sequelize.STRING
},
tool_id: {
allowNull: false,
foreignKey: true,
autoIncrement: false,
references: {
model: 'Tools',
key: 'tool_id',
},
type: Sequelize.INTEGER,
},
quantity: {
type: Sequelize.INTEGER
},
uses: {
type: Sequelize.INTEGER,
defaultValue: 0,
},
createdAt: {
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
defaultValue: Sequelize.literal('CURRENT_TIMESTAMP'),
type: Sequelize.DATE
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('UserTools');
},
};
我希望UserTools是一个关联表,其中user_id
和tool_id
是一个组合键,并且我希望在此表上具有其他属性,因此我需要通过模型/表。使用上面的示例,我的用户模型上没有任何关联方法。如果我尝试使用User.hasMany(Tool,{as:'tools',through:'UserTools'}),则会收到一条错误消息,提示hasMany无法使用直通选项。
我可能只是弄乱了简单而明显的东西,但是我很难弄清是什么,很多在线示例要么不完整,要么不使用基于类的模型。