【发布时间】:2015-02-25 03:06:14
【问题描述】:
我想更新联结表,以添加/删除适当的记录(使用 bookshelfjs)。我认为使用 updatePivot 可以做到这一点,但这不起作用。现在我只是在尝试删除相关联结记录的严厉方法,但这甚至不起作用。这里有一些sn-ps。
一、表结构:
resources table
-(id)
-(url)
tags table
-(id)
-(name)
resource_has_tags
-(resource_id)
-(tag_id)
例如,一个资源与零个或多个标签相关联。联结表具有每个关系的记录。具体来说,初始案例(创建):创建新资源(id:1),与标签#100、101 相关。结果:resource_has_tags 表有 2 条记录(1 - 100 和 1 - 101)。第二种情况(更新):资源现在应该与标签 102、103 相关联。resource_has_tags 应该是 (1 - 102, 1 - 103)。
资源模型文件
tags: function () {
return this.belongsToMany('Tag', 'resource_has_tags', 'resource_id', 'tag_id');
},
getTags: function() {
return this.related('tags');
},
getTagsJSON: function() {
return this.getTags().map(function(i){
return {id: i.id, name: i.get('name')};
});
},
资源控制器的创建方法示例(可行)。
'create': function(req, res) {
var data = clean(req.body),
tags = [],
topics = [];
if (data.tags) {
tags = data.tags;
delete data.tags;
}
if (data.topics) {
topics = data.topics;
delete data.topics;
}
Resource.forge(data).save()
.then(function(model) {
Promise.all([
model.getTags().attach(tags),
model.getTopics().attach(tags)
])
.then(function(){
res.json(model);
})
.catch(function(err) {
res.json(err);
});
})
.catch(function(err) {
res.json(err);
});
我的资源控制器的更新方法(这不会删除或刷新联结表)。
'update': function(req, res) {
var data = clean(req.body),
tags = [],
topics = [];
if (data.tags) {
tags = data.tags;
delete data.tags;
}
if (data.topics) {
topics = data.topics;
delete data.topics;
}
req.resource.save(data, {patch: 'true'})
.then(function(model) {
Promise.all([
model.getTags().updatePivot()
])
.then(function(){
res.status(204);
res.json();
})
})
.catch(function(err) {
res.json(err);
});
【问题讨论】:
-
您需要使用附加和分离功能,您想使用书架功能来做到这一点。我相信 updatePivot 用于更新不是外键或其他键的枢轴中的数据
标签: javascript node.js bookshelf.js