@z77
2018-05-14T02:31:59.000000Z
字数 2142
阅读 2512
Bmob
BmobRelation
BmobPoint
多对多关系
一对多关联
Bmob中的数据关联分为Pointer和Relation两种。
在程序设计中,不同类型的数据之间可能存在某种关系。分别是以下三种:
1. 一对一,比如车队给司机分车,1个司机对应1台车;
2. 一对多,比如1个作者会对应多篇贴子;
3. 多对多,比如1篇帖子会有多个喜欢的读者,而每个读者也会有多篇喜欢的帖子。
前面的两种关系我们提供Pointer类型来表示,而最后一种关系我们使用Relation类型来表示
在下面的讲解中我们可能会使用到以下的两张表,其表结构如下:
_User
字段 | 类型 | 含义 |
---|---|---|
objectId | string | |
username | string | 用户名,用户可以是作者发帖子,也可以是读者点赞 |
Post
字段 | 类型 | 含义 |
---|---|---|
objectId | string | |
author | Pointer(_User) | 作者 |
likes | Relation(_User) | 喜欢帖子的读者 |
例子: 帖子表(Post)有个Point类型的、关联到用户表(_User)的字段,名为author,用来记录该帖子的作者。
1.添加关联,将当前帖子curPost的author字段设置为我(把帖子的作者设置成我)
var currentUser = Bmob.User.current();
var curPost = Bmob.Object.createWithoutData("Post", "320b0395f3");
curPost.set("author", currentUser);
curPost.save();
2.关联查询,查询当前帖子 curPost 的详细信息,包括关联字段 author(获得这个帖子的详细信息,和这个帖子作者的详细信息)
var Post = Bmob.Object.extend("Post");
var query = new Bmob.Query(Post);
query.include("author");
query.get("4edc3f6ee9", {
success: function(result) {
console.log('查询成功 >', result);
// 获得作者的名字
// result.get("author").username
},
error: function(error) {
console.log("查询失败: " + error.code + " " + error.message);
}
});
例子: 帖子表(Post)有个Relation类型的、关联到用户表(_User)的字段,名为likes,用来记录点赞过该帖子的用户信息。
(如果你想在_User表添加列关联到Post,下面全部反过来理解就行)
1. 添加关联,向添加当前帖子curPost的likes字段添加我(点赞这个帖子)
var currentUser = Bmob.User.current();
var curPost = Bmob.Object.createWithoutData("Post", "320b0395f3");
var relation = curPost.relation("likes");
relation.add(currentUser);
// 加多个: relation.add([u1, u2, u3]);
// 取消赞: relation.remove(currentUser);
// 取消多个 relation.remove([u1, u2, u3]);
curPost.save();
2. 关联查询,查询当前帖子 curPost 的关联字段 likes(获得点赞过这个帖子的所有用户)
var curPost = Bmob.Object.createWithoutData("Post", "320b0395f3");
var relation = new Bmob.Relation(curPost, "likes");
relation.targetClassName = "_User"; // 这一行是关键,文档都没有
var query = relation.query();
// 你可以在query中加入更多的条件
query.find({
success: function(results) {
console.log('查询成功 >', results);
},
error: function(error) {
console.log("查询失败: " + error.code + " " + error.message);
}
});
3. 反向关联查询,查询Post 表中 likes 列中有我的 Post(获得我点赞了的帖子)
var currentUser = Bmob.User.current();
var query = Bmob.Relation.reverseQuery('Post', 'likes', currentUser);
query.find({
success: function(results) {
console.log('查询成功 >', results);
},
error: function(error) {
console.log("查询失败: " + error.code + " " + error.message);
}
});