2015-02-24 2 views
0

Я хотел бы обновить таблицу соединений, чтобы добавить/удалить соответствующие записи (с книжными полками). Я думал, что это возможно с updatePivot, но это не сработало. Теперь я просто пытаюсь применить жесткий подход к удалению соответствующих записей соединений, но это даже не работает. Вот некоторые фрагменты.Обновление таблицы переходов с помощью bookshelfjs

Во-первых, структура таблицы:

resources table 
-(id) 
-(url) 

tags table 
-(id) 
-(name) 

resource_has_tags 
-(resource_id) 
-(tag_id) 

Например, ресурс связан с нулем или более тегов. В таблице соединений есть запись для каждой связи. В частности, Initial case (create): Создать новый ресурс (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

Вам необходимо использовать функции прикрепления и отсоединения, которые вы хотите сделать, используя функции книжной полки. Я считаю, updatePivot используется для обновления данных в точке, которая не является ключом foreignkey или otherkey – vbranden

ответ

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