将数据保存到belongsToMany创build的表中,并从中读取(最后的解决scheme)

我正在使用我的后端Node.js,Express.js和Sequelize连接到数据库。 我有一个:任务和键之间的关系。 模式

任务和密钥由我和TaskKey通过Sequelize创build:

后端

// Tasks n:m Keys db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'}); db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'}); 

现在,如果我创build一个新的任务

前端

 $scope.create = () => { this.$http.post('/api/tasks', { user_id: $scope.selectUser, lang_id: $scope.selectLang, name: $scope.newTask }); } 

我想用这个请求发送一个用户select的所有键的数组。

在后端它应该添加一个条目到任务发送的每个Dict的新任务的任务键。 例如

表任务:

 ID | some values 1 | some values | this is the new task created 

在数组中发送密钥[2,5,6]

TaskKey /在同一时刻在这个表中创build相关键

 TaskID | KeyID 1 | 2 1 | 5 1 | 6 

我怎样才能做到这一点?

之后,我想展示一个任务。 以前为例。 获取任务,其中id = 1 ng – 重复所有数据,并获取所有的键感谢表TaskKey。

我无法find一个解释这个例子,我目前唯一的解决scheme是在$http.post(taskkey)的前端与表格TaskKey中的每个键的foreach 。 但后来在Live System中会有超过1000个密钥,所以这不是一个可接受的解决scheme。 有没有一个好的解决scheme,为后端?

EDIT1:

 ... working fine $scope.create = () => { this.$http.post('/api/tasks', { task:{ user_id: $scope.selectUser, lang_id: $scope.selectLang, name: $scope.newTask }, keys:[1,2,3,4,5] }); ... ... // Creates a new Task in the DB export function create(req, res) { return Task.create(req.body.task) .then(function(task){ return task.addTaskKeys(req.body.keys);//throws 500error //console.log(req.body.keys);//working fine getting the Keys }) .then(respondWithResult(res, 201)) .catch(handleError(res)); } ... 

阅读文档belongsToManyDoc没有什么帮助,因为没有例子或详细解释。 我曾尝试过几件事情:

  • addTask / addTasks / addTaskKeys / addKey在文档解释添加关联
  • createTask / createKey / createTaskKeys创build关联

在我的后端我没有任何function的任务键只有任务和键。 但据我了解,我不需要任何的任务键,因为与

  // Tasks n:m Keys db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'}); db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'}); 

创build中间表是任务和键之间的关联。 所以通常添加/创build应该只是工作,它应该在TaskKeys中添加实例。

  export function create(req, res) { return Task.create(req.body.task) .then(function(task){ return task.addTaskKeys(req.body.keys);//throws 500error 

与task.addTaskKeys添加关联刚刚创build的任务=> task_id

用req.body.keys给他钥匙=> key_id
如果我从Doc更改为minde DB:

 ... example Project.create({ id: 11 }).then(function (project) { user.addProjects([project, 12]); }); ... mine return Task.create(req.body.task) .then(function(task){ return DictKey.addTasks([task,{key_id : 1}]);//still error })//DictKey.addTask(task,1); still error 

阅读属于许多协会并引用它:

user.addProject(project,{status:'started'})默认情况下,代码将projectId和userId添加到UserProjects表

尝试使用关联创build:

http://sequelize.readthedocs.io/en/latest/docs/associations/#creating-elements-of-a-hasmany-or-belongstomany-association对不起,不允许发布更多的1链接。

 export function create(req, res) { return Task.create({ name: req.body.task.name, user_id: req.body.task.user_id, lang_id: req.body.task.lang_id, key_id:[req.body.keys] },{ include: [DictKey] }) 

没有错误,但只创build任务不TaskKeys ….所以我做错整个时间?

Edit2:对于testing我在MsSql中由我自己插入数据表中的TaskKeys。 TaskKey /自创数据与SqlQuery

 TaskID | KeyID 1 | 1 1 | 2 1 | 3 2 | 4 2 | 5 

从我的前台得到它

 this.$http.get('/api/tasks/' +2 ) .then(response => { this.Tasks = response.data; console.log(this.Tasks); }); 

后端

 // Gets a single Task from the DB export function show(req, res) { return Task.findAll({ where: { _id: req.params.id }, include: [{ model: DictKey }] }) .then(handleEntityNotFound(res)) .then(respondWithResult(res)) .catch(handleError(res)); } 

ConsoleOutput:

 [Object] Object _id:2 // the searched TaskId= 2 => right dict_Keys:Array[2] // the Dependant 2 KeyIds => right 

所以创build的表格工作正常。 问题现在只是为什么用addKey通过后端添加不像在例子中一样工作。 尝试使用示例来检查关联:

 // Creates a new Task in the DB export function create(req, res) { Task.create({ name: req.body.task.name, user_id: req.body.task.user_id, lang_id: req.body.task.lang_id }).then(function(task) { return DictKey.create({ name:req.body.task.name,notice:req.body.task.name, user_id:req.body.task.user_id }) .then(function(key) { return task.hasDictKey(key).then(function(result) { // result would be false return task.addDictKey(key).then(function() { return task.hasDictKey(key).then(function(result) { // result would be true }) }) }) }) }) 

引发task.hasDictKey不是一个函数

 db.Task.create({ name: 'test', user_id: 266, lang_id: 9, key_id:[1,2] },{ include: [db.DictKey] }) 

引发dict_Keys没有关联到任务所以这意味着他们没有连接在一起? 在数据库中读取数据和插入数据正在工作吗?

现在就添加Sequelize的例子:

 var Usert = db.sequelize.define('usert', {}) var Project = db.sequelize.define('project', {}) var UserProjects = db.sequelize.define('userProjects', { status: Sequelize.STRING }) Usert.belongsToMany(Project, { through: UserProjects }) Project.belongsToMany(Usert, { through: UserProjects }) Usert.addProject(Project, { status: 'started' })//addProject is not a Function // for real ? now not even their own is not working? :/ 

回答
通过阅读我认为与文件

 // Tasks n:m Keys db.DictKey.belongsToMany(db.Task, { through: TaskKeys , foreignKey:'key_id',otherKey:'task_id'}); db.Task.belongsToMany(db.DictKey, { through: TaskKeys , foreignKey: 'task_id',otherKey: 'key_id'}); 

它会自动生成添加/设置/获取/创build任务为DictKey和添加/设置/获取/创build任务DictKey。

命名策略

默认情况下,sequelize将使用模型名称(传递给sequelize.define的名称)在关联中使用时找出模型的名称。

意思是它添加函数的表名模型去你define('dict_Keys'...所以添加/设置/得到/ Dict_Key任务。这是问题,因为我使用addDictkey而不是addDict_Key,我希望它可以帮助未来的其他人

前端:要从前端获取数据,只需将该数组作为要发布的data的属性即可。 您可能还想将特定于任务的属性包装在自己的对象中:

 this.$http.post('/api/tasks', { task: { user_id: $scope.selectUser, lang_id: $scope.selectLang, name: $scope.newTask }, keys: [ 2, 5, 6 ] }); 

后端: Sequelize和其他ORM试图为您提供使用您定义的关系的工具。 使用它们。 您已经使用了belongsToMany ,所以您只需要执行下一步使用创build的Task对象在TaskKeys创buildm:n条目:

 ... return Task.create(req.body.task) .then(function(task) { return task.addProjects(req.body.keys); }) .then(respondWithResult(res, 201)) .catch(handleError(res)); ... 

至于用键获取任务,只需使用include选项:

 ... return Task.findById(req.params.id, { include: [ { model: db.DictKey } ] }) ... 

foreignKey应该是相同的,要设置其他关键字使用otherKey选项。