首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Sequelize findOne-includes:缺少连接表id

Sequelize findOne-includes:缺少连接表id
EN

Stack Overflow用户
提问于 2019-05-21 01:37:38
回答 2查看 656关注 0票数 0

我想查询一个主题与学生,其中包括连接表。这种关系是多对多的。我想使用连接表id (StudentSubject),但返回的结果为空

代码语言:javascript
复制
Subject.findOne({
            where:{id},
            include: [
                { model: Student, attribute: ['id', 'name']},
                { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
            ]
        })

关系如下

学生

代码语言:javascript
复制
Student.belongsToMany(models.Subject, { through: models.StudentSubject, foreignKey: 'student'})
Student.belongsTo(models.StudentSubject, {foreignKey: 'id', targetKey: 'student', as: 'studentSubject'})

主题

代码语言:javascript
复制
Subject.belongsToMany(models.Student, { through: models.StudentSubject, foreignKey: 'subject'})
Subject.belongsTo(models.StudentSubject, { foreignKey: 'id', targetKey: 'subject', as: 'studentSubject'})

连接表模型

代码语言:javascript
复制
// it has id by default in the migration file
const StudentSubject = sequelize.define('StudentSubject', {
    student: DataTypes.INTEGER,
    subject: DataTypes.INTEGER,
    score: DataTypes.INTEGER
  }

结果是丢失了连接表id,这里我错过了什么?

附加实验

还尝试了嵌套的include in Student,不起作用。它也没有id

代码语言:javascript
复制
Subject.findOne({
            where:{id},
            include: [
                { model: Student, attribute: ['id', 'name'], include: [
                    { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
                ]},
            ]
        })
EN

回答 2

Stack Overflow用户

发布于 2019-05-21 18:10:51

事实证明,我必须在连接表模型中定义id。我的想法并非如此,所以就是这样

代码语言:javascript
复制
sequelize.define('StudentSubject', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    student: DataTypes.INTEGER,
    subject: DataTypes.INTEGER,
    score: DataTypes.INTEGER
  }

我错误地定义了这些关联,所以我得出了这个结论

代码语言:javascript
复制
Student.hasMany(models.StudentSubject, {foreignKey: 'student'})
Subject.hasMany(models.StudentSubject, { foreignKey: 'subject'})
StudentSubject.belongsTo(models.Student, {foreignKey: 'student', sourceKey: 'id'})
StudentSubject.belongsTo(models.Subject, {foreignKey: 'subject', sourceKey: 'id'})

现在,当使用

代码语言:javascript
复制
Subject.findOne({
            where:{id},
            include: [
                { model: Student, attribute: ['id', 'name'], include: [
                    { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
                ]},
            ]
        })

它现在可以工作了

票数 1
EN

Stack Overflow用户

发布于 2019-05-21 03:34:47

我还没有对此进行测试,但是您可能需要在第一个代码块中包含Subject表的id。下面的内容可能会帮你找到你想要的。

代码语言:javascript
复制
Subject.findOne({
        where:{id},
        include: [
            { model: Subject, attribute: ['id']},
            { model: Student, attribute: ['id', 'name']},
            { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
        ]
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56225728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档