node.js - Node Sequelize 关系挑战
问题描述
我有三个表(所有关联的模型类名都使用 PascalCase)
schools school_codes course
------ ------ ------
id (pk) code (pk) name
name school_id (fk) school_code (fk)
我正在尝试定义续集关系,以便此课程查找返回关联的学校:
const courseWithSchool = await models.Course.findOne({
include: [{
model: models.School,
required: true,
}],
})
用于此的 mysql 非常简单。
mysql> select c.*, s.* from courses c inner join school_codes sc on c.school_code = sc.code inner join schools s on s.id = sc.school_id;
如何定义续集模型中的关系(不修改现有模式)?谢谢!
以下是我的模型定义:
学校.js
module.exports = (sequelize, DataTypes) => {
const School = sequelize.define('School', {
name: DataTypes.STRING,
}, { underscored: true, freezeTableName: true, tableName: 'schools' })
return School
}
course.js
module.exports = (sequelize, DataTypes) => {
const Course = sequelize.define('Course', {
id: {
type: DataTypes.STRING,
primaryKey: true,
},
name: DataTypes.STRING,
school_code: {
type: DataTypes.STRING,
references: {
model: 'school_codes',
key: 'code',
}
}
}, { underscored: true, freezeTableName: true, tableName: 'courses' })
return Course
}
schoolcode.js
module.exports = (sequelize, DataTypes) => {
const SchoolCode = sequelize.define('SchoolCode', {
code:{
type: DataTypes.STRING,
primaryKey: true,
references: {
model: 'courses',
key: 'school_code'
}
},
school_id: {
type: DataTypes.INTEGER,
references: {
model: 'schools',
key: 'id',
},
},
}, { underscored: true, freezeTableName: true, tableName: 'school_codes', })
return SchoolCode
}
我只是在寻找要添加到每个模型定义底部的关系-例如...
// School.associate = function (models) {
// School.belongsToMany(models.Course, {
// through: 'school_codes',
// foreignKey: 'school_id',
// otherKey: 'code'
// })
// }
解决方案
我们可以在其各自的模型中保持关联。我更喜欢在各自的主表而不是映射表中保持关联。这个想法是将source
模型与target
模型及其在两个方向上的关系相关联。例如,假设源模型School
有一个SchoolCode
目标模型及其反向关系
//school.model.js
module.exports = (sequelize, DataTypes) => {
const School = sequelize.define('school', {
name: DataTypes.STRING,
}, { underscored: true, freezeTableName: true, tableName: 'schools' })
School.associate = function ({SchoolCode, Course}) {
School.hasOne(SchoolCode, {
foreignKey: 'school_id',
})
SchoolCode.belongsTo(School, {foreignKey: 'school_id'})
School.belongsToMany(Course, { through: SchoolCode , foreignKey : 'school_id'}); //added new
}
return School;
}
//course.model.js
module.exports = (sequelize, DataTypes) => {
const Course = sequelize.define('course', {
id: {
type: DataTypes.STRING,
primaryKey: true,
},
name: DataTypes.STRING,
school_code: {
type: DataTypes.STRING,
references: {
model: 'school_codes',
key: 'code',
}
}
}, { underscored: true, freezeTableName: true, tableName: 'courses' })
Course.associate = function ({SchoolCode, School}) {
Course.hasMany(SchoolCode, {
foreignKey: 'code',
})
Course.belongsToMany(School, { through: SchoolCode, foreignKey : 'code'}); //added new
}
return Course;
}
最后是SchoolCode
(映射表)的第三种模型。请注意,我们不必添加引用school_code
。它是code
同一张表的primaryKey。我们references
主要用来定义外键,这里不需要逆向定义。因此,从下面的代码中评论了该部分。
module.exports = (sequelize, DataTypes) => {
const SchoolCode = sequelize.define('SchoolCode', {
code:{
type: DataTypes.STRING,
primaryKey: true,
// references: {
// model: 'courses',
// key: 'school_code'
// }
},
school_id: {
type: DataTypes.INTEGER,
references: {
model: 'school',
key: 'id',
},
},
}, { underscored: true, freezeTableName: true, tableName: 'school_codes', })
return SchoolCode
}
推荐阅读
- c# - 做一个课堂项目,设法得到一些稳定的代码。但是它没有按预期计算。为什么以及什么会解决它?
- numpy - 如何在 np.reshape 期间指定顺序
- arrays - 如何在 REACT JS 中以特定 JSON 对象格式推送 localStorage 中的数组?
- c# - 如何解决统一 IAP 未正确初始化的问题?
- c++ - 比较 C++ 中的 str.erase() 效率
- java - Kontakt.io SDK:有没有办法在信标列表中进行硬编码,以便我可以在需要搜索信标时随机提取它们?
- ios - 当导航器从第二页弹出时,来自背景的 Flutter webview 恢复应用程序显示白屏
- php - 如何更新特定会话的会话变量
- php - 如何通过ajax上传文件而不会超时?
- javascript - 如何在浏览器版本对数组中找到最小的版本号?