2017-01-16 3 views
0

Я пытаюсь связать 4 таблицы. Задачи, задачи, вопросы и параметры.Sequelize - Сопоставление 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); 
    }); 
}); 

Все, что я получаю связь между Task и вопросы. Когда я получаю ответы на вопросы отдельно, я получаю опции под ним. Но, похоже, не может сразу получить все.

Возможно ли это. И дайте мне знать, следуйте ли вы правильному подходу к созданию базы данных в этом формате.

Мне нужна одна задача, чтобы содержать несколько вопросов, и одни вопросы могут появляться в нескольких задачах. Каждый вопрос должен содержать несколько вариантов.

ответ

1

Да, это возможно, и кроется в документации на http://docs.sequelizejs.com/en/latest/docs/models-usage/#nested-eager-loading

В принципе, вместо того, чтобы поместить модель как models.Question в вашем включают массив, вы помещаете объект, с помощью ключа для model и ключа для вложенная include «s

Для примера выше, что-то вроде этого следует сделать трюк:

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

Он работал. Большое спасибо. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^