概念
- Pointer
假設有三個Parse Class,分別是User、Boy、Girl。
User包含了所有Boy+Girl,意思是User是所有的集合。Boy是單純是取出所有User中性別欄位為男性的資料,而Girl單純是User中為女性的資料。
User Class中有的欄位為:[性別、姓名、年齡]
Boy Class中有的欄位為:[健身房會籍、基本資料]
Girl Class中有的欄位為:[閨密名稱、基本資料]
Boy跟Girl中的基本資料都指向User Class的某一筆資料,這時候基本資料的欄位型態就可以設定為Pointer。
- 先複習如何取Parse上除了Pointer跟Relation的一般值
const query = new Parse.Query(Parse.Object.extend('ParseClass'));
let result = await query.find();
this.data = result.map(item =>{
return
{
jobNumber : item.get('jobNumber');
}
)
讀取Pointer
假設目標Class叫ParseClass,有pointer的欄位叫type,我們要抓的是type裡指過去的TypeClass的name欄位,先用上面的方法試試看。
const query = new Parse.Query(Parse.Object.extend('ParseClass));let result = await query.find();this.data = result.map(item =>{ return { name: item.get('type').get('name'), }})
這時候會發現抓不到東西,但如果item.get(‘type’)是有東西的,意思是可以抓到type但抓不到type指向的name。
解決方法:在Point欄位需要額外使用include,寫法如下
const query = new Parse.Query(Parse.Object.extend('ParseClass'));query.include('type');let result = await query.find();this.data = result.map(item =>{ return { name: item.get('type').get('name'), }})
讀取Relation
假設ParseClass下有一個group欄位的資料型態是Relation,現在要取出他所有Relation的Parse Object,寫法如下:
public async getRelation(){ //先取得第一層的資料 const query = new Parse.Query(Parse.Object.extend('ParseClass')); let result = await query.find();
//假設資料只有一筆 let query_group = result[0].relation("group").query();
let groupObj = []; groupObj.push(query_group.find()); return Promise.all(groupObj)
}
relation意思有點像是當前物件的下一頁,再query一次就能取出資料
寫入Pointer
我們要寫一筆含有Pointer的資料上Parse,原理是先找出要指向的資料,把那筆資料find()出來,然後set好後save()上目標Class。
假設指向資料的Class名稱為ParseClass,並要把這筆資料寫入TargetClass的test欄位。
//先找出要指向的資料,這邊指向ParseClass的name等於Ray的資料。
const queryTask = new Parse.Query(Parse.Object.extend('ParseClass')).equalTo("name","Ray");//再來就是把這筆資料存上目標的Class,我們假設要存到TargetClassPromise.all(await queryTask.find()).then(obj =>{var query = Parse.Object.extend("TargetClass");
var rowData = new query();
//因為find()出來可能有好幾筆,這邊假設只有一筆,也就是第一筆,所以給obj[0]
rowData.set("test", obj[0]);
//這樣就設定好了,再來是儲存
rowData.save().then(()=> {
console.log('最後儲存狀態:成功');
}).catch(function(error) {
console.log('最後儲存狀態:失敗',error);
});
})
寫入Relation
一開始跟寫入Pointer一樣,要把要寫入的資料先find()出來,假設我們要的資料是所有name等於this.inputObj.name陣列中的任一值。
const queryTask = new Parse.Query(Parse.Object.extend('ParseClass'))
.containedIn("name",this.inputObj.name);
let obj = await queryTask.find();
假設this.inputObj.name=[“Ray”,”Zoe”,”Leblanc”],這邊使用到containerIn的意思就是指定要ParseClass上所有name等於Ray或Zoe或Leblanc的資料,最後讓find()去撈出來。
queryTask.find()會給出一個obj,裡面有陣列包含了好幾筆資料,假設我們要把這些資料存入TargetClass的test欄位,test是一個relation格式的欄位
var query = Parse.Object.extend("TargetClass");var rowData = new query();var test = rowData.relation(‘group’)test.add(obj)rowData.save()
1.先 extend要存入的class
2.然後決定 class要放relation的欄位
3.新增
4.儲存
補充
1.資料包好後回傳
抓完一筆資料後可能不是每個欄位都會使用到,所以用兩層return,只回傳會用到的資料的obj
public async getRecordData(id){ const query = new Parse.Query(Parse.Object.extend(‘CareRecordInfo’)) .equalTo(‘objectId’,id) .include(‘elder’) let result = await query.find(); var data = result.map(item =>{ return { name : item.get(‘elder’).get(‘userNickname’) } }) return data}
2.透過Object Id,取得該筆資料,並寫入Pointer欄位
如果想要寫入一Pointer欄位資料,則先拿到該筆資料再將他Set進要儲存對應的欄位,可以先query該Class並透過equalTo ObjectId的方式取得該筆資料,但這樣太麻煩了,可以透過createWithoutData寫成以下
假設要將A Class,ObjectId為123的資料,透過Pointer寫入B Class的Test欄位
const newObj= new (Parse.Object.extend(B));newObj.set
(
'Test',
Parse.Object.extend(A).createWithoutData(123)
);