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

时间:2017-04-04 15:20:40

标签: mysql node.js typescript

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

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;

和任务模型

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

我想要实现的是在TaskModel中的tool_project_id和ProjectModel中的phabricator_project_id之间创建关系(它们是相同的值,只给出diff列名),并为GET请求编写查询,该请求以下面显示的形式输出数据< / p>

  

{{project1Details,TaskDetails - &gt; {task1,task2,task3},   {project2Details,TaskDetails - &gt; {task4,task5,task6},   {project3Details,TaskDetails - &gt; {task7,task8,task9},   {project4Details,TaskDetails - &gt; {task10,task11,task12}}

所有数据库设计都已相应完成,并调用另一个文件来创建所有这些数据库。这是用打字稿写的,我试过这个作为GET方法

{{1}}

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

  

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

对这个问题的任何帮助都会非常充实

1 个答案:

答案 0 :(得分:1)

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

创建关系,键的名称也应相同,以便创建关系。

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

然后创建表项目,然后创建任务

 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来分别管理表的节点和关系