我想更新联结表,添加/删除适当的记录(使用bookshelfjs)。我认为这可以通过updatePivot实现,但这不起作用。现在我只是尝试删除相关联结记录的严厉方法,但这甚至不起作用。这是一些片段。
首先,表结构:
resources table
-(id)
-(url)
tags table
-(id)
-(name)
resource_has_tags
-(resource_id)
-(tag_id)
例如,A资源与零个或多个标记相关联。联结表有每个关系的记录。具体来说,初始情况(创建):创建新资源(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);
});
答案 0 :(得分:-1)
我让这个工作。它不漂亮,但有效。我只是首先核对联结表中的所有条目,然后重新附加(使用新值)。不理想,但它的工作原理。如果有人仍然知道如何正确使用updatePivot,我宁愿使用它。
'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.related('tags').detach(),
model.getTags().attach(tags),
model.related('topics').detach(),
model.getTopics().attach(topics)
])
.then(function(){
res.status(204);
res.json();
})
})
.catch(function(err) {
res.json(err);
});