node.js - Node Sequelize 关系挑战

标签 node.js sequelize.js

我有三个表(所有关联的模型类名都使用 PascalCase)

schools                school_codes              course
------                 ------                    ------
id (pk)                code (pk)                 name
name                   school_id (fk)            school_code (fk)
我正在尝试定义 Sequelize 关系,以便此类(class)查找返回关联的学校:
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;
如何定义 Sequelize 模型中的关系(不修改现有架构)?谢谢!
这是我拥有的模型定义:
school.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。我们主要使用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
  }
引用资料:https://sequelize.org/master/manual/assocs.html

关于node.js - Node Sequelize 关系挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406805/

相关文章:

javascript - 如何修复 Nodemon "async remove {}"语法错误?

javascript - stub 未被调用

node.js - Sequelize promise 总是返回假

sql - Sequelize : Tables aren't associating properly

node.js - Cordova:找不到模块主体解析器

node.js - V8/Node.js 增加允许的最大字符串长度

node.js - 如何在 Electron 中发送(模拟)键绑定(bind)到 webContents?

node.js - 如何在nodejs中将 'select if'函数与sequ​​elize一起使用

node.js - Sequelize setter 错误 'invalid input syntax for integer: "[对象对象]"'

node.js - 序列化查询特定的belongsToMany关联