【问题标题】:How to query for info from 2 tables with sequelize如何使用 sequelize 从 2 个表中查询信息
【发布时间】:2017-04-15 10:33:44
【问题描述】:

所以我有两个表:Class 和 Course。每个班级都有一个 course_id,它定义了课程表上的课程类型。这是我的模型:

const Class = sequelize.define('class', {
  class_date: Sequelize.DATE,
  begin_time: Sequelize.TIME,
  end_time: Sequelize.TIME,
  max_capacity: Sequelize.INTEGER,
  is_published: Sequelize.BOOLEAN,
  training_facility_id: Sequelize.INTEGER,
  state_id: Sequelize.INTEGER,
  registration_deadline: Sequelize.DATE,
  course_id: Sequelize.INTEGER,
  is_report_60_generated: Sequelize.BOOLEAN,
  completed_by_user_id: Sequelize.INTEGER
}, {
  timestamps: false,
  freezeTableName: true
})

const Course = sequelize.define('course', {
  code: Sequelize.STRING,
  name: Sequelize.STRING
 }, {
  timestamps: false,
  freezeTableName: true
})

当我点击类端点时,我得到了一个类数组。我将如何设置查询以响应每个课程的课程名称和代码,而不仅仅是 course_id?

【问题讨论】:

  • 您需要创建关联/关系,类型取决于您的数据模型。一对一、一对多等等……
  • 那么如果有很多类并且每个类只能有一个课程名称,那就是一对多?它看起来像 Course.hasMany(Class, {as: 'Classes'}) 吗?
  • 是的,我重新阅读了您的问题并看到了您在做什么,刚刚发布了关系定义/查询的答案。基本上你所拥有的,除了你可能想将列指定为NOT NULL,而且由于它是自动创建的,你在我们的模型定义中不需要它。 Sequelize 文档还有很多不足之处。

标签: javascript database postgresql sequelize.js


【解决方案1】:

您需要在ClassCourse 模型之间使用create a relationship。如果您在模型定义中指定underscored: true 选项,它将不会使用驼峰式大小写,并且会自动创建Class.course_id 列,因此您不需要定义它(completed_by_user_id 可能也是如此)。

const Class = sequelize.define('class', {
  class_date: Sequelize.DATE,
  begin_time: Sequelize.TIME,
  end_time: Sequelize.TIME,
  max_capacity: Sequelize.INTEGER,
  is_published: Sequelize.BOOLEAN,
  training_facility_id: Sequelize.INTEGER,
  state_id: Sequelize.INTEGER,
  registration_deadline: Sequelize.DATE,

  // this will be auto-created by the relationship
  // course_id: Sequelize.INTEGER,

  is_report_60_generated: Sequelize.BOOLEAN,
  // you probably want a relationship here as well
  completed_by_user_id: Sequelize.INTEGER
}, {
  timestamps: false,
  freezeTableName: true,

  // use underscored names
  underscored: true,
})

const Course = sequelize.define('course', {
  code: Sequelize.STRING,
  name: Sequelize.STRING
 }, {
  timestamps: false,
  freezeTableName: true,
  underscored: true,
})

根据您的数据模型,似乎每个 Class 都需要一个关联的 Course 并具有不同的属性,例如开始时间等,因此您将告诉 Sequelize 每个 Class belongsTo() 一个 Course

// tell Sequelize that once course will be assigned to many classes, and it is required (not null)
Class.belongsTo(Course, { foreignKey: { allowNull: false } })

一旦它们相关,您就可以使用include option 值来指定一个模型来加入您的主查询。如果您在关系中使用as,您也必须在此处指定它。

// do a joined query using "include"
Class.findAll({
  include: [
    {
      model: Course
    }
  ]
})

【讨论】:

  • 感谢您的详细回答,但我收到此错误:“课程(课程)与课程无关!”
  • D'oh,我复制了一些代码,但查询数据的方式不同。尝试从两者中删除as 参数,看看它是否有效...
  • 从两者中删除'as',但仍然得到这个:课程与课程无关!
  • 我更新了答案,很确​​定您需要使用belongsTo(),因为每个Class 都有一个Course - 似乎在我的测试中创建了正确的模式。由于您没有使用as,所以到处都不要使用它。
  • 如果您希望能够同时执行Class.getCourses()Course.getClass(),您需要定义两个方向的关系,即hasMany()belongsTo()
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2016-11-05
  • 2015-10-14
相关资源
最近更新 更多