概要
前回は$select
というクエリについて説明しました
今回は$relatedTo
というクエリについて紹介したいと思います
$relatedTo
は参照先のオブジェクト情報を取得することができるクエリです
これまた動きがわかりづらかったのでメモがてら説明します
環境
- Mac OS X 10.8.5
- Parse.com(2014/12/02 時点)
- curl
説明
ポイントはAddRelation
というオペレーションを使ってオブジェクトの紐付けを作ることです
AddRelation
で紐付けたデータを$relatedTo
で取得する流れになります
curlで事前にデータを投入
AddRelation
で紐付けるためのデータを投入します
UIからだと結構面倒なのでcurlを使ってデータを投入します
今回はUserとRole内のオブジェクトを紐付けたいと思います
Userの登録
まずはUserにデータを登録します
これはUIからポチポチやっても簡単に登録できます
curlの場合は以下のような感じで実行してください
curl -X POST \
-H "X-Parse-Application-Id: 1234567890abcdefghijklmnopqrstuvwxyz" \
-H "X-Parse-REST-API-Key: 1234567890abcdefghijklmnopqrstuvwxyz" \
-H "Content-Type: application/json" \
-d '{"username":"hogesuke","password":"hogePassword"}' \
https://api.parse.com/1/users
レスポンスは以下のような感じです
{"createdAt":"2014-12-02T09:54:03.452Z","objectId":"8bZxTztWyi","sessionToken":"q4sgqSh4cErY7pNapscijj5ir"}
このレスポンスのobjectId
の欄をメモしておいてください
Roleと紐付けるときのクエリ内で使用します
UI上では以下のように登録されています
ここで表示されているobjectIdを使います
Roleの登録
UserとRoleが紐づくようにデータを投入します
クエリは以下の通り
curl -X POST \
-H "X-Parse-Application-Id: 1234567890abcdefghijklmnopqrstuvwxyz" \
-H "X-Parse-REST-API-Key: 1234567890abcdefghijklmnopqrstuvwxyz" \
-H "Content-Type: application/json" \
-d '{
"name": "testRole",
"ACL": {
"*": {
"read": true
}
},
"users": {
"__op": "AddRelation",
"objects": [
{
"__type": "Pointer",
"className": "_User",
"objectId": "8bZxTztWyi"
}
]
}
}' \
https://api.parse.com/1/roles
うーん、長いですね
ポイントはusers
の部分でここのusers.objects.objectIdの部分で先ほど登録したユーザのobjectIdを指定します
__type
とか__op
とかは決められた予約語みたいなもので
Pointer型のオブジェクトをAddRelationすることで紐付けすることができます
レスポンスは以下の通り
{"createdAt":"2014-12-02T10:00:47.223Z","objectId":"8WzqLyJChx"}
UIでもロールが作成されていることを確認します
usersのカラムにView Relations
というボタンがあり、これをクリックすると先ほど作成したユーザ情報に遷移すると思います
rolesのカラムにもView Relations
があります
これは_Role
というクラスを参照しているようで自動的に作成されるRelationのようです
これで$relatedTo
を実行するための準備が整いました
curlでクエリを作成する
$relatedTo
を発行して参照先の情報を取得してみます
まずクエリは以下の通り
curl -X GET \
-H "X-Parse-Application-Id: 1234567890abcdefghijklmnopqrstuvwxyz" \
-H "X-Parse-REST-API-Key: 1234567890abcdefghijklmnopqrstuvwxyz" \
-G \
--data-urlencode 'where={"$relatedTo":{"object":{"__type":"Pointer","className":"_Role","objectId":"6RTvQxdzgP"},"key":"users"}}' \
https://api.parse.com/1/users
where
が非常に長ったらしいですね
ではこのクエリに関して説明していきます
動作の仕組み
まずアクセスするURIには参照先のクラスを指定します
今回は参照先のユーザの情報がほしいのでURIはhttps://api.parse.com/1/users
になります
そしてwhereの中に入るのは_Role
(参照元)を検索する条件を記載します
もうちょっと言うと今回はロールで絞込をした上でその検索結果が持つ参照先の情報を取得するという流れになります
なのでwhere内でロールを絞り込みます
where内の以下の部分に関してはほぼ定形文になります
{“$relatedTo”:{“object”:{“__type”:”Pointer”,”className”:”_Role”,”objectId”:”6RTvQxdzgP”}
変更しなければいけない部分はclassName
とobjectId
の部分です
classNameは参照元のクラスを記載します、今回はロールが参照元になるので_Role
を記載します
そしてロール絞り込むための条件はobjectId
になります
ここで指定しているobjectIdは先ほど作成したロールのobjectIdを指定します
そして上記の続きで以下のjsonがあります
,”key”:”users”}}
これは検索元である_Roleのどのカラムに参照先の情報があるのかを指定してします
UIでロールの情報を見るとわかりますが、users
というカラムにView Relationsというボタンがあったのでそのカラム名を指定します
つまり
- _RoleをobjectIdで検索して
- その検索結果のusersカラムが持つ参照情報を元に
- 参照先の情報を取得する流れ
という感じになります
使いそうなケースとしてはユーザの属性情報を別のクラスで管理したいときなどでしょうか
今回は1つのロールに対して1人のユーザしかいませんでしたが、Relationは複数紐付けできるので1つのロールに属する複数のユーザを取得したりすることもできます
今回の場合だとAddRelation
するときのobjects配列に複数のユーザを登録すれば複数のユーザを取得することができるようになります
"users": {
"__op": "AddRelation",
"objects": [
{
"__type": "Pointer",
"className": "_User",
"objectId": "8bZxTztWyi"
},
{
"__type": "Pointer",
"className": "_User",
"objectId": "93lVCBcNsd"
}
]
}
0 件のコメント:
コメントを投稿