2017-01-16 31 views
0

我想聯繫4個表。任務,任務問題,問題和選項。續集 - 將4個表聯繫起來

enter image description here

我的型號如下

任務模式:

var Sequelize = require('sequelize'); 

module.exports = function(sequelize, DataTypes) { 
    var Task = sequelize.define('Task', { 
    task_id: { 
     type: Sequelize.STRING, 
     primaryKey: true 
    }, 
    task_name: { 
     type: Sequelize.STRING, 
     allowNull: true 
    }, 
    task_description: { 
     type: Sequelize.STRING, 
     allowNull: true 
    } 
    },{ 
    classMethods: { 
     associate: function(models) { 
     Task.belongsToMany(models.Question, { 
      through: { 
      model: models.TaskQuestion 
      }, 
      foreignKey: 'task_id' 
     }) 
     } 
    } 
    }); 
    return Task; 
}; 

TaskQuestions型號:

var Sequelize = require('sequelize'); 

module.exports = function(sequelize, DataTypes) { 
    var TaskQuestion = sequelize.define('TaskQuestion', { 
    tq_id: { 
     type: Sequelize.STRING, 
     primaryKey: true 
    } 
    }); 
    return TaskQuestion; 
}; 

問題型號:

var Sequelize = require('sequelize'); 

module.exports = function(sequelize, DataTypes) { 
    var Question = sequelize.define('Question', { 
    question_id: { 
     type: Sequelize.STRING, 
     primaryKey: true 
    }, 
    question_description: { 
     type: Sequelize.STRING, 
     allowNull: true 
    }, 
    question_type: { 
     type: Sequelize.STRING, 
     allowNull: true 
    } 
    },{ 
    classMethods: { 
     associate: function(models) { 
     Question.hasMany(models.Option, { 
      foreignKey: { 
      name: 'question_id', 
      allowNull: false 
      } 
     }), 
     Question.belongsToMany(models.Task, { 
      through: { 
       model: models.TaskQuestion 
      }, 
      foreignKey: 'question_id' 
     }) 
     } 
    } 
    }); 
    return Question; 
}; 

期權模型:

var Sequelize = require('sequelize'); 

module.exports = function(sequelize, DataTypes) { 
    var Option = sequelize.define('Option', { 
    option_id: { 
     type: Sequelize.STRING, 
     primaryKey: true 
    }, 
    question_id: { 
     type: Sequelize.STRING, 
     allowNull: true 
    }, 
    option_description: { 
     type: Sequelize.STRING, 
     allowNull: true 
    }, 
    option_type: { 
     type: Sequelize.STRING, 
     allowNull: true 
    } 
    },{ 
    classMethods: { 

    } 
    }); 
    return Option; 
}; 

當我嘗試檢索數據

router.get('/:task_id', function(req, res) { 
    models.Task.findOne({ 
    where: { 
     task_id: req.params.task_id 
    }, 
    include: [ models.Question ] 
    }).then(function(task) { 
    res.json(task); 
    }); 
}); 

我得到的任務和問題之間的關聯。當我單獨檢索問題時,我會看到它下面的選項。但似乎無法立即檢索全部。

這是可能的。讓我知道是否按照這種格式設計數據庫的正確方法。

我需要一個任務來包含多個問題,同一個問題可以出現在多個任務中。每個問題應該包含多個選項。

回答

1

是的,這是可能的,並且在http://docs.sequelizejs.com/en/latest/docs/models-usage/#nested-eager-loading

覆蓋的文件中基本上,而不是把一個模型像models.Question你包括數組,你把一個對象,與model一個密鑰和一鍵嵌套0​​的

對於你上面的例子,這樣的事情應該做的伎倆:

router.get('/:task_id', function(req, res) { 
    models.Task.findOne({ 
    where: { 
     task_id: req.params.task_id 
    }, 
    include: [{ 
     model: models.Question, 
     include: [models.Option] 
    }] 
    }).then(function(task) { 
    res.json(task); 
    }); 
}); 
+0

它的工作。非常感謝。 :) –