2

多対多のリレーションシップで 2 つの Bookshelf モデルがあり、いくつかのリレーションシップをアタッチまたはデタッチするときにタイムスタンプを更新したいと考えています。

ここに私のモデルがあります:

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 でピボット モデルを定義する必要がありますか?

ありがとう

4

1 に答える 1

5

ピボット モデルを簡単に作成し、移行を作成し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);
                });
            });

        });

    });
});

更新されるジャンクション テーブル内の特定の行をフィルター処理できるコード部分にコメントしました (省略した場合、対応するすべての行が更新されます)。

お役に立てれば!

于 2015-06-29T19:53:25.287 に答える