在 sequelize 中创建多对多关联时出现问题。 (属于多)
Problem creating many to many association in sequelize. (belongsToMany)
当我定义两个 table 之间的多对多关联时出现以下错误:
Error: Teacher.belongsToMany called with something that's not a subclass of Sequelize.Model
我会解释我的场景。
我有老师和课程 tables,为了创建关联,我创建了一个名为 courses_teachers 的枢轴 table。
courses_teachers 的迁移代码:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('courses_teachers', {
id: {
type: Sequelize.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true,
},
course_id: {
type: Sequelize.INTEGER,
allowNull: false,
references: { model: 'courses', key: 'id' },
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
},
teacher_id: {
type: Sequelize.INTEGER,
allowNull: false,
references: { model: 'teachers', key: 'id' },
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
},
updated_at: {
type: Sequelize.DATE,
allowNull: false,
},
});
},
down: (queryInterface) => {
return queryInterface.dropTable('courses_teachers');
},
};
型号:
老师:
import Sequelize, { Model } from 'sequelize';
class Teacher extends Model {
static init(sequelize) {
super.init(
{
name: Sequelize.STRING,
},
{
sequelize,
}
);
return this;
}
static associate(models) {
this.belongsToMany(models.Course, {
foreignKey: 'teacher_id',
through: 'courses_teachers',
as: 'courses',
});
}
}
export default Teacher;
课程:
import Sequelize, { Model } from 'sequelize';
class Courses extends Model {
static init(sequelize) {
super.init(
{
name: Sequelize.STRING,
},
{
sequelize,
}
);
return this;
}
static associate(models) {
this.belongsToMany(models.Teacher, {
foreignKey: 'course_id',
through: 'courses_teachers',
as: 'teachers',
});
}
}
export default Courses;
错误:
C:\eadfabet\node_modules\sequelize\lib\associations\mixin.js:49 throw new Error(`${this.name}.belongsToMany called with something that's not a subclass of Sequelize.Model`);
^
Error: Teacher.belongsToMany called with something that's not a subclass of Sequelize.Model
at Function.belongsToMany (C:\eadfabet\node_modules\sequelize\lib\associations\mixin.js:49:13)
at Function.associate (C:\eadfabet\src\app\models\Teacher.js:33:10)
at C:\eadfabet\src\database\index.js:26:45
at Array.map (<anonymous>)
at Database.init (C:\eadfabet\src\database\index.js:25:8)
at new Database (C:\eadfabet\src\database\index.js:17:10)
at Object.<anonymous> (C:\eadfabet\src\database\index.js:31:20) ...
[nodemon] app crashed - waiting for file changes before starting...
错误只出现在模范老师身上,模范课程不会出现。
我错误地引用了示范课程。
谢谢@William Prigol Lopes!
当我定义两个 table 之间的多对多关联时出现以下错误:
Error: Teacher.belongsToMany called with something that's not a subclass of Sequelize.Model
我会解释我的场景。
我有老师和课程 tables,为了创建关联,我创建了一个名为 courses_teachers 的枢轴 table。
courses_teachers 的迁移代码:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('courses_teachers', {
id: {
type: Sequelize.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true,
},
course_id: {
type: Sequelize.INTEGER,
allowNull: false,
references: { model: 'courses', key: 'id' },
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
},
teacher_id: {
type: Sequelize.INTEGER,
allowNull: false,
references: { model: 'teachers', key: 'id' },
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
},
updated_at: {
type: Sequelize.DATE,
allowNull: false,
},
});
},
down: (queryInterface) => {
return queryInterface.dropTable('courses_teachers');
},
};
型号:
老师:
import Sequelize, { Model } from 'sequelize';
class Teacher extends Model {
static init(sequelize) {
super.init(
{
name: Sequelize.STRING,
},
{
sequelize,
}
);
return this;
}
static associate(models) {
this.belongsToMany(models.Course, {
foreignKey: 'teacher_id',
through: 'courses_teachers',
as: 'courses',
});
}
}
export default Teacher;
课程:
import Sequelize, { Model } from 'sequelize';
class Courses extends Model {
static init(sequelize) {
super.init(
{
name: Sequelize.STRING,
},
{
sequelize,
}
);
return this;
}
static associate(models) {
this.belongsToMany(models.Teacher, {
foreignKey: 'course_id',
through: 'courses_teachers',
as: 'teachers',
});
}
}
export default Courses;
错误:
C:\eadfabet\node_modules\sequelize\lib\associations\mixin.js:49 throw new Error(`${this.name}.belongsToMany called with something that's not a subclass of Sequelize.Model`);
^
Error: Teacher.belongsToMany called with something that's not a subclass of Sequelize.Model
at Function.belongsToMany (C:\eadfabet\node_modules\sequelize\lib\associations\mixin.js:49:13)
at Function.associate (C:\eadfabet\src\app\models\Teacher.js:33:10)
at C:\eadfabet\src\database\index.js:26:45
at Array.map (<anonymous>)
at Database.init (C:\eadfabet\src\database\index.js:25:8)
at new Database (C:\eadfabet\src\database\index.js:17:10)
at Object.<anonymous> (C:\eadfabet\src\database\index.js:31:20) ...
[nodemon] app crashed - waiting for file changes before starting...
错误只出现在模范老师身上,模范课程不会出现。
我错误地引用了示范课程。
谢谢@William Prigol Lopes!