使用bookshelfjs更新联结表

时间:2015-02-24 18:27:39

标签: javascript node.js bookshelf.js

我想更新联结表,添加/删除适当的记录(使用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);
        });

1 个答案:

答案 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);
        });