返回存在数据透视表项的模型

时间:2015-03-17 17:27:25

标签: node.js backbone.js bookshelf.js

我正在使用BookshelfJS。我有两个模型usersposts。显然,这里的关系很多很多。所以我有一个数据透视表post_user

现在,给定user_id,我想找到该用户的所有posts。到目前为止,我已设法使用knex

执行此操作
knex.select()
    .from('post_user')
    .where('user_id', user_id)
    .then(function (pivots) {
        // Now loop through pivots and return all the posts
        // Using pivot.post_id
        pivots.map(function(pivot) {})
    });

有更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

您需要在Bookshelf模型中定义多对多关系。像这样:

var User = bookshelf.Model.extend({
  tableName: 'users',
  posts: function() {
    return this.belongsToMany(Post);
  }
});

var Post = bookshelf.Model.extend({
  tableName: 'posts',
  users: function() {
    return this.belongsToMany(User);
  }
});

按照惯例,Bookshelf将使用的数据透视表是posts_users(表名与_结合,从按字母顺序排在第一位的表开始)。它应该包含user_idpost_id(以及这两者的coposite PK)。如果您不想重命名数据透视表,请参阅documentation for belongsToMany以获取有关如何定义数据透视表的表和ID的说明。

在此之后,您可以使用Bookshelf查询模型:

return new User().where('id', user_id)
    .fetch({withRelated: 'posts'})
    .then(function (user) {
       var postCollection = user.get('posts');
       // do something with the posts
    });

另请参阅fetch的文档。