Bookshelf.js - 如何从连接表中获取列?

时间:2015-05-09 16:01:41

标签: mysql node.js bookshelf.js

我有一个用户模型和一个课程模型,他们有多对多的关系,所以基本上用户可以加入多个课程,课程有很多用户(学生)。我有一个连接表,我正在尝试向连接表添加其他信息。基本上,用户每个课程可以提出每月的问题配额。所以我在User_Course连接表中添加了一个配额列。我无法访问配额列。以下是提供想法的相关代码。

var User = DB.Model.extend({
    Courses: function() {
        return this.belongsToMany('Course', 'User_Course', 'userId', 'courseId');
    },
});

var Course = DB.Model.extend({
    Users: function() {
        return this.belongsToMany('User', 'User_Course', 'courseId', 'userId');
    }
})

User_Course是我的连接表,其中包含额外的配额列:

**User_Course:**
userId: int
courseId: int
quota: int

我希望能够减少我的配额值。我可以使用updatePivot更新它,但我无法简单地获得配额中的值。这是我用来更新值的代码:

var userPromise = new User.User({userId: userId}).fetch({withRelated: ['Courses']});
userPromise.then(function(_user) {
    _user.related('enrolledCourses').updatePivot({courseId:courseId, quota:1}).then(function() {
        return;
    })

})

如您所见,我每次都将配额值更新为1。我想以编程方式确定当前的配额值,然后递减它。

2 个答案:

答案 0 :(得分:7)

试试let result = boolStream .scan(({mostRecentFalse, latestValue}, bool) => { return bool ? {mostRecentFalse, latestValue: true} : {mostRecentFalse: Date.now(), lastValue: false} }, {mostRecentFalse: Date.now()}) .changes() .map(({mostRecentFalse, latestValue}) => latestValue && (Date.now() - mostRecentFalse > 5000)) .skipDuplicates(); 。例如,withPivot您可以在此处放置您的配额,并在加载关系时获得配额。

<强>更新

好的,这是一个例子:

return this.belongsToMany(Comment).withPivot(['created_at', 'order']);

所以基本上不是简单地说 new Town().where({ town_number: 2301 }).fetchAll({ columns: ['town_title', 'id'], withRelated: [{ 'address': function(qb) { qb.select('addresses.town_id', 'addresses.participant_id'); qb.columns('addresses.street_name'); // here you could simply do qb.where({something_id: 1}); as well } }] }).then(function(result) { res.json(result); }); ,而是将表名定义为对象,将属性withRelated: ['table_name']table_name作为值,具有查询构建器({{ 1}})你可以分别查询该表。

希望这有帮助!

答案 1 :(得分:0)

在我学习更合适的方法之前,我使用knex.raw来使用mysql语句来减少配额列。在我的控制器中,我调用decrementQuota并传入userId和courseId:

function decrementQuota(userId, courseId) {
    new User.User({userId: userId}).decrementQuota(userId, courseId);
}

在我的用户模型中,knex.raw调用通过递减配额值来更新User_Course。

var User = DB.Model.extend({
    decrementQuota: function(uid, cid) {
        DB.knex.raw('update User_Course set quota = quota -1 where userId=' + uid + ' and courseId=' + cid).then(function(quota) {

        });
    },
})