使用Bookshelf.js在枢轴模型上设置时间戳

时间:2015-06-17 09:37:27

标签: node.js orm bookshelf.js knex.js

我在多对多关系中有两个书架模型,并且我希望在我附加或分离某些关系时更新时间戳。

这是我的模特:

var Video = Bookshelf.Model.extend({
  tableName: 'video',

  program: function(){
    return this.belongsToMany(Bookshelf.model('Program'), 'programvideo', 'videoId', 'programId');
  }
});
var Program = Bookshelf.Model.extend({
  tableName: 'program',

  videos: function(){
    return this.belongsToMany(Bookshelf.model('Video'), 'programvideo', 'programId', 'videoId');
  }
});

当我使用

时,一切正常
prgm.videos().attach(videos);

但有没有办法为这种关系添加时间戳?我是否需要在Bookshelf中定义枢轴模型?

由于

1 个答案:

答案 0 :(得分:3)

嗯,您可以轻松制作透视模型,在迁移中创建timestamps并在模型中启用时间戳,一切都可以无缝工作!

但是,如果您想在没有其他模型的情况下解决此问题,则必须首先在模型中定义withPivot,例如:

var Stations = bookshelf.Model.extend({
    tableName: 'stations',
    stationsRoutes: function() {
        return this.belongsToMany(Routes, 'stations_routes').withPivot('time');
    }
});

var Routes = bookshelf.Model.extend({
    tableName: 'routes',
    stationsRoutes: function() {
        return this.belongsToMany(Stations, 'stations_routes').withPivot('time');
    }
});

然后,每次附加数据时,都必须调用updatePivot,例如:

router.get('/updatePivot/:id', function(req, res) {
    new Routes({
        'id': req.params.id
    }).fetch({
        withRelated: ['stationsRoutes']
    }).then(function(result) {

        result.stationsRoutes().attach({
            station_id: 3
        }).then(function() {

            result.stationsRoutes().updatePivot({
                'time': '09:09'
            }/*, {
                query: function(qb) {
                    qb.where({
                        'id': 8
                    });
                }
            }*/).then(function() {
                result.load('stationsRoutes').then(function(result_reloaded){
                    res.json(result_reloaded);
                });
            });

        });

    });
});

我评论了一段代码,您可以在其中过滤更新的联结表中的特定行(如果省略,所有相应的行都会更新)。

希望这有帮助!