javascript - 如何使用 Knex.js 查询多对多关系?
问题描述
我在 Postgres 中有这样多对多的关系:
// migrations/2020_create_initial_tables.js
exports.up = function(knex) {
return knex.schema
.createTable('students', function(table) {
table.increments('id').primary()
table
.string('email')
.unique()
.index()
table.string('password')
})
.createTable('courses', function(table) {
table.increments('id').primary()
table.string('title').notNullable()
table.text('description')
})
// A student can enroll many courses
// A course can have many students
.createTable('student_courses', function(table) {
table.increments('id').primary()
table
.integer('student_id')
.references('id')
.inTable('students')
table
.integer('course_id')
.references('id')
.inTable('courses')
})
.catch(err => {
console.error(err)
throw err
})
// .finally(() => knex.destroy());
}
exports.down = function(knex) {
return knex.schema
.dropTableIfExists('students')
.dropTableIfExists('courses')
.dropTableIfExists('student_courses')
.catch(err => {
console.error(err)
throw err
})
}
我需要显示一个学生的注册课程。如何查询(全部/数组courses
)student.id
?
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
堆栈:TypeScript、knex@v0.20.12、Postgres@12-alpine、pg@v7.18.2
解决方案
const coursesOfSingleStudent = await knex('courses').whereIn('id',
knex('student_courses').select('course_id').where('student_id', studentId)
)
尽管您最好使用 objection.js,它允许您声明关系映射,然后直接查询:
const studentWithCourses = await Student.query().findById(studentId).withGraphFetched('courses');
推荐阅读
- python - Python 中的一行平均值(使用 Pandas 读取 CSV 文件)
- node.js - Angular - 如何导入 googleapis 库?
- json - 在 Dart 中使用 json_serializable 访问 json 中的嵌套对象
- pytorch - 在 pytorch 中包装两个张量以获得新张量的大小为 2
- python - 无法摆脱python中的elif无效语法
- sql - Oracle SQL:数据不会插入超级表
- javascript - Axios 错误:连接 ECONNREFUSED 127.0.0.1:80
- pine-script - 如何在 Pine Editor 中编写多时间框架代码?
- css - vuetifyjs网格列的全高并在溢出时滚动
- web - 可以通过单击导航栏上的通知图标打开的框的 aria-role 应该是什么?