2017-04-04 286 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管理節點和表的關係分別