Sequelize findOne-includes: идентификатор таблицы соединений отсутствует - PullRequest
0 голосов
/ 20 мая 2019

Я хочу запросить тему с учеником с включенной таблицей соединений.Отношения много ко многим.Я хочу иметь идентификатор объединяющей таблицы (StudentSubject), но возвращаемый результат будет пустым

Subject.findOne({
            where:{id},
            include: [
                { model: Student, attribute: ['id', 'name']},
                { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
            ]
        })

Отношение следующее:

student

Student.belongsToMany(models.Subject, { through: models.StudentSubject, foreignKey: 'student'})
Student.belongsTo(models.StudentSubject, {foreignKey: 'id', targetKey: 'student', as: 'studentSubject'})

субъект

Subject.belongsToMany(models.Student, { through: models.StudentSubject, foreignKey: 'subject'})
Subject.belongsTo(models.StudentSubject, { foreignKey: 'id', targetKey: 'subject', as: 'studentSubject'})

модели таблиц соединений

// it has id by default in the migration file
const StudentSubject = sequelize.define('StudentSubject', {
    student: DataTypes.INTEGER,
    subject: DataTypes.INTEGER,
    score: DataTypes.INTEGER
  }

в результате отсутствует идентификатор таблицы соединений, чтоя здесь скучаю?

enter image description here

дополнительный эксперимент

пробовал также с вложенным включением в Student, не работает.у него тоже нет идентификатора

Subject.findOne({
            where:{id},
            include: [
                { model: Student, attribute: ['id', 'name'], include: [
                    { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
                ]},
            ]
        })

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Оказывается, я должен определить идентификатор в моделях таблицы соединений. Я думал иначе, так что вот оно

sequelize.define('StudentSubject', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    student: DataTypes.INTEGER,
    subject: DataTypes.INTEGER,
    score: DataTypes.INTEGER
  }

и я неправильно определяю ассоциации, поэтому пришел к этому

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'})

и теперь при запросе с

Subject.findOne({
            where:{id},
            include: [
                { model: Student, attribute: ['id', 'name'], include: [
                    { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
                ]},
            ]
        })

теперь работает

0 голосов
/ 20 мая 2019

Я не проверял это, но вам может понадобиться включить id таблицы Subject в ваш первый блок кода.Ниже приведено то, что вы ищете.

Subject.findOne({
        where:{id},
        include: [
            { model: Subject, attribute: ['id']},
            { model: Student, attribute: ['id', 'name']},
            { model: StudentSubject, attribute: ['id', 'subject', 'student', 'score'], as: "studentSubject"}
        ]
    })
...