【问题标题】:Creating Primary and Foreign Key relations in Sequelize在 Sequelize 中创建主键和外键关系
【发布时间】:2017-08-29 21:30:16
【问题描述】:

我有 2 个模型 Project 模型和 Task 模型在 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 之间创建关系(它们是相同的值,仅给出不同的列名)并为 GET 请求编写查询,该请求以如下所示的形式输出数据

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

所有数据库设计都已相应完成,并调用另一个文件来创建所有这些数据库。这是用打字稿写的,我尝试将其作为 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);
        });
    }

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

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

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

【问题讨论】:

  • 使用catch handler处理promise的rejected状态

标签: mysql node.js typescript


【解决方案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分别管理表的节点和关系

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多