【學習筆記】 Angular × Parse 《Pointer & Relation》

Ray
7 min readJun 18, 2021

--

概念

  • 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)
);

--

--

No responses yet