我正在使用BookshelfJS。我有两个模型users
和posts
。显然,这里的关系很多很多。所以我有一个数据透视表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) {})
});
有更清洁的方法吗?
答案 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_id
和post_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的文档。