在Sequelize中创build主键和外键关系

我有两个模型项目模型和任务模型在sequelize中定义如下所示

import { INTEGER, STRING, DATE } from 'sequelize'; import sequelize from '../sequelize'; import Task from './task.model' const ProjectModel = sequelize.define('project', { project_id: { type: INTEGER, primaryKey: true, autoIncrement: true }, phabricator_project_id: { type: STRING, allowNull: false }, name: { type: STRING }, description: { type: STRING }, start_date: { type: STRING, }, end_date: { type: STRING } }, { timestamps: false } ); export default ProjectModel; 

和任务模型

 import { INTEGER, STRING, DATE } from 'sequelize'; import sequelize from '../sequelize'; const TaskModel = sequelize.define('task', { task_id: { type: INTEGER, primaryKey: true, autoIncrement: true }, title: { type: STRING }, status: { type: STRING }, priority: { type: STRING }, description: { type: STRING }, tool_project_id: { type: STRING }, date_modified: { type: STRING } }, { timestamps: false } ); export default TaskModel; 

我想要实现的是在TaskModel中的tool_project_id和ProjectModel中的phabricator_project_id(它们是相同的值,只给出diff列名)之间build立一个关系,并为GET请求写一个查询,输出下面显示的数据

{project1Details,TaskDetails – > {task1,task2,task3},{project2Details,TaskDetails – > {task4,task5,task6},{project3Details,TaskDetails – > {task7,task8,task9},{project4Details,TaskDetails – > {task10,task11,task12}}

所有的数据库devise已经完成,另外一个文件被调用来创build所有这些数据库。 这是写在打字稿,我试图作为一个GET方法

 listByProjects(req, res) { TaskModel.belongsTo(ProjectModel, { as: 'task' , foreignKey: 'tool_project_id'}); ProjectModel.findAll({ include:[{model:TaskModel}], where:{status:'open'} }).then(function(projects) { res.json(projects); }); } 

在这个方法中,我定义关系并尝试列出所有“打开”的任务,并将其作为响应发回,但是我收到了错误

未处理的拒绝错误:任务未关联到项目!

任何帮助这个问题都会很好

这个问题的答案是,当创build表格时,我们应该创build关系,然后创build表格,如

创build关系也应该是相同的关键字的名称,以创build关系。

  TaskModel.belongsTo(ProjectModel, {foreignKey: 'project_id' }); ProjectModel.hasMany(TaskModel, { foreignKey: 'project_id' }); 

然后创build表格项目,然后创build任务

  ProjectModel.sync({ force: false }).then(function () { console.log('Project table created'); TaskModel.sync({ force: false }).then(function () { console.log('Task table created'); }); }); 

那么在API方法中,您正在调用的只是包含要提供的模型以获取所需的数据。

  ProjectModel.findAll({ include: [{ model: TimeSheetModel, where: { status: "ACTIVE" }, }], }).then(function (projects) { const responseData = { 'status': 1, 'message': 'List successfull.', 'projects': projects, }; res.json(responseData); }).catch(error => { const responseData = { 'status': 1, 'message': error.message, 'projects': [], }; res.json(responseData); }) 

这个使用nodemon和sequilize分别pipe理表的节点和关系