2017-04-04 182 views
1

我有sequelize定义2个模型项目模型和任务模型如下图所示创建主键和外键关系

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列名称),并写入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); 
     }); 
    } 

这里,但我得到的错误

Unhandled rejection Error: task is not associated to project!

任何有助于该问题的WONDERFULL

+0

使用'catch'处理程序来处理承诺的拒绝状态 –

回答

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