首页 > 解决方案 > Sequelize 有很多关联

问题描述

我正在为 hasMany 关联考虑这两个表“exam_response”和“answer”。这两个表都包含“question_id”。使用 question_id 我需要答案。

考试响应表

module.exports = (sequelize, DataTypes) => {
  const exam_response = sequelize.define('exam_response', {
    id: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4
    },
    session_id: {
      type: DataTypes.UUID,
      allowNull: false
    },
    exam_id: {
      type: DataTypes.UUID,
      allowNull: false
    },
    user_id: {
      type: DataTypes.UUID,
      allowNull: false
    },
    question_id: {
      type: DataTypes.UUID,
      allowNull: false
    },
    answer_ids: {
      type: DataTypes.ARRAY(DataTypes.UUID),
      allowNull: false
    },
    is_correct: {
      type: DataTypes.BOOLEAN,
      allowNull: false
    },
    is_bookmarked: {
      type: DataTypes.BOOLEAN,
      allowNull: false
    },
    is_attempted: {
      type: DataTypes.BOOLEAN,
      allowNull: false
    },
    createdAt: {
      type: DataTypes.DATE,
      field: 'created_at'
    },
    updatedAt: {
      type: DataTypes.DATE,
      field: 'updated_at'
    }
  }, {});
  exam_response.associate = function (models) {
    // associations can be defined here
    exam_response.hasMany(models.answer, {
      foreignKey: 'question_id', sourceKey: 'question_id',as:'exam_answers'
    });
  };

答案表

'use strict';
module.exports = (sequelize, DataTypes) => {
  const answer = sequelize.define('answer', {
      //{
      //     "id":"",
      //     "question_id":"123",
      //     "position":0,
      //     "answer":"This is answer 1."
      //  }
    id: {
      allowNull: false,
      primaryKey: true,
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4
    },
    question_id: {
      allowNull: false,
      type: DataTypes.UUID
    },
    position: {
      allowNull: false,
      type: DataTypes.INTEGER
    },
    answer: {
      allowNull: false,
      type: DataTypes.TEXT
    },
    publish_status: {
      allowNull: false,
      type: DataTypes.ENUM('published', 'unpublished', 'deleted')
    },
    language: {
      type: DataTypes.ENUM('en', 'kn', 'hi')
    },
    createdAt: {
      type: DataTypes.DATE,
      field: 'created_at'
    },
    updatedAt: {
      type: DataTypes.DATE,
      field: 'updated_at'
    }
  }, {});
    answer.associate = models => {
      answer.belongsTo(models.question,{foreignKey:'question_id',as:'answers'});
      answer.belongsTo(models.exam_response,{foreignKey:'question_id', targetKey: 'question_id',as:'exam_answers'});
    };

  return answer;
};

询问::

    ExamResponse.findAll({
        where: {
            exam_id
        },
        include: [
            {
                model: Answer,as:'exam_answers'
            }
        ],
    }).then(resp => {
        response.successGet(res, resp, 'Exam Response');

    }).catch(next)

我得到了输出,但相关部分(“exam_answers”)为空。如果我使用原始查询,我可以获得输出。但是即使值存在,查询也只是给我取了exam_response而不是答案。

标签: node.jspostgresqlsequelize.js

解决方案


推荐阅读