[关闭]
@z77 2018-05-14T02:31:59.000000Z 字数 2142 阅读 2347

一对多关联BmobPoint 和 多对多关系BmobRelation学习笔记 (js,微信小程序)

Bmob BmobRelation BmobPoint 多对多关系 一对多关联

Bmob中的数据关联分为PointerRelation两种。

在程序设计中,不同类型的数据之间可能存在某种关系。分别是以下三种:
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,下面全部反过来理解就行)

Post表有个Relation类型、指向_User表的字段 likes。图侵删

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);
    }
});
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注