【问题标题】:Updating a junction table with bookshelfjs使用 bookshelfjs 更新连接表
【发布时间】: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


【解决方案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);
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 2016-12-11
    • 2012-06-11
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2013-12-11
    相关资源
    最近更新 更多