Angularjs Sequelize将数据保存在BelongToMany创建的表中并从中读取(最后的解决方案)
我正在使用Backend Node.js、Express.js和Sequelize连接数据库。 我在任务和键之间有一个n:m关系。 任务和密钥由我和TaskKey通过Sequelize with创建: 后端Angularjs Sequelize将数据保存在BelongToMany创建的表中并从中读取(最后的解决方案),angularjs,sql-server,node.js,express,sequelize.js,Angularjs,Sql Server,Node.js,Express,Sequelize.js,我正在使用Backend Node.js、Express.js和Sequelize连接数据库。 我在任务和键之间有一个n:m关系。 任务和密钥由我和TaskKey通过Sequelize with创建: 后端 // Tasks n:m Keys db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'}); db.Task.belongsToMany(db.DictKey,
// Tasks n:m Keys
db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'});
db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'});
$scope.create = () => {
this.$http.post('/api/tasks', {
user_id: $scope.selectUser,
lang_id: $scope.selectLang,
name: $scope.newTask
});
}
现在,如果我在
前端
// Tasks n:m Keys
db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'});
db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'});
$scope.create = () => {
this.$http.post('/api/tasks', {
user_id: $scope.selectUser,
lang_id: $scope.selectLang,
name: $scope.newTask
});
}
我想随该请求一起发送用户选择的所有密钥的数组
在后端,它应该为每个发送的DictKey为新任务添加一个条目到TaskKeys
。
比如说
表任务:
ID | some values
1 | some values | this is the new task created
在数组[2,5,6]中发送密钥
TaskKey/同时在此表中创建从属密钥
TaskID | KeyID
1 | 2
1 | 5
1 | 6
我怎样才能做到这一点
之后,我想展示一个任务。
以前面的例子为例。
获取id=1的任务
ng由于TaskKey表,重复所有数据并获得所有键
我找不到一个例子来解释这一点,目前我唯一的解决方案是在前端使用$http.post(taskkey)
为表中的每个键使用foreach
。但是稍后在实时系统中会有1000多个密钥,所以这不是一个可接受的解决方案。
对于后端,有没有一个好的解决方案
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));
}
...
阅读文档没有多大帮助,因为没有示例或详细说明。
我试过以下几种方法:
- addTask/addTasks/addTaskKeys/addKey如文档中为添加关联而解释的
- createTask/createKey/createTaskKeys用于创建关联
// Tasks n:m Keys
db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'});
db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'});
创建中间表任务和键之间存在关联。因此,通常情况下,添加/创建应该可以正常工作,并且应该在TaskKey中添加实例
export function create(req, res) {
return Task.create(req.body.task)
.then(function(task){
return task.addTaskKeys(req.body.keys);//throws 500error
使用task.addTaskKeys添加与刚创建的task=>task\u id的关联
req.body.keys给他钥匙=>key\u id如果我以Doc change到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(项目,{status:'started'})
默认情况下,代码将向UserProjects表添加projectId和userId
正在尝试创建关联:
// 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
})
})
})
})
})
抱歉,不允许发布更多的as 1链接
无错误,但仅创建任务而非任务键。。。。
那么我一直在做错什么呢
Edit2:
为了进行测试,我在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));
}
后端
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));
}
控制台输出:
[Object]
Object
_id:2 // the searched TaskId= 2 => right
dict_Keys:Array[2] // the Dependant 2 KeyIds => right
因此,创建的表工作正常。
现在的问题是,为什么通过后端添加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_键与任务不关联
这意味着它们没有联系在一起?但是在数据库中读取数据和插入数据是否有效
现在刚刚添加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'});
它将自动为DictKey生成add/set/get/create任务,并为Task生成add/set/get/create DictKey
但是
命名策略
默认情况下,sequelize将使用模型名称(传递给
sequelize.define)来计算模型在中使用时的名称
协会
这意味着它会根据您要定义的表模型的名称添加函数('dict_Keys')…
所以将/set/get/Dict_键添加到任务中。
这就是问题所在,因为我使用的是addDictkey而不是addDict_Key。
我希望它能帮助将来的其他人前端:要从前端获取数据,只需将数组作为您发布的
数据的属性。您可能还希望将特定于任务的属性包装到他们自己的对象中:
this.$http.post('/api/tasks', {
task: {
user_id: $scope.selectUser,
lang_id: $scope.selectLang,
name: $scope.newTask
},
keys: [ 2, 5, 6 ]
});
后端:Sequelize和其他ORM试图为您提供使用您定义的关系的工具。使用它们。您已经在使用,因此您只需执行下一步,即使用您创建的任务
对象在任务键
中创建m: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
选项。谢谢帮助。前端正在工作,但后端仍然存在问题。如果您可以检查Edit1,当您收到return task.addTaskKeys(req.body.keys)的500错误时,控制台在服务器上会显示什么;
?Console.log:…先创建任务。创建然后执行任务添加POST/api/tasks 500 57.938 ms-2
BrwoserConsole日志:POSThttp://localhost:9000/api/tasks 500(内部服务器错误)
我尝试使用像addTask(1)这样的硬代码值;//1确保键表中100%存在相同的错误您可以在启动服务器之前将DEBUG
环境变量设置为*
,然后重试吗?这应该会提供更多信息…例如DEBUG=*node server.js
执行DEBUG=express:*node index.js
,在调试时从express文档开始。输出没有太大变化t、 但是注释Task.create
out并仅执行return Task.addKeys(1)
给出错误,无法读取未定义的addTask的属性?在//Tasks n:m Keys db.DictKey.belongtomany(db.Task,{through:'TaskKeys',foreignKey:'key\u id',otherKey:'Task\u id'});db.Task.belongtomany(db.DictKey,{through:'TaskKeys',foreignKey:'task_id',otherKey:'key_id'});
未解决此问题。它与b