2014年12月2日火曜日

Parse.comの$relatedToというクエリについて調べてみた

概要

前回$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を使います
insert_user.png

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でもロールが作成されていることを確認します
insert_role.png
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”}

変更しなければいけない部分はclassNameobjectIdの部分です
classNameは参照元のクラスを記載します、今回はロールが参照元になるので_Roleを記載します
そしてロール絞り込むための条件はobjectIdになります
ここで指定しているobjectIdは先ほど作成したロールのobjectIdを指定します

そして上記の続きで以下のjsonがあります

,”key”:”users”}}

これは検索元である_Roleのどのカラムに参照先の情報があるのかを指定してします
UIでロールの情報を見るとわかりますが、usersというカラムにView Relationsというボタンがあったのでそのカラム名を指定します

つまり

  1. _RoleをobjectIdで検索して
  2. その検索結果のusersカラムが持つ参照情報を元に
  3. 参照先の情報を取得する流れ

という感じになります

使いそうなケースとしてはユーザの属性情報を別のクラスで管理したいときなどでしょうか
今回は1つのロールに対して1人のユーザしかいませんでしたが、Relationは複数紐付けできるので1つのロールに属する複数のユーザを取得したりすることもできます
今回の場合だとAddRelationするときのobjects配列に複数のユーザを登録すれば複数のユーザを取得することができるようになります

"users": {
  "__op": "AddRelation",
  "objects": [
    {
      "__type": "Pointer",
      "className": "_User",
      "objectId": "8bZxTztWyi"
    },
   {
      "__type": "Pointer",
      "className": "_User",
      "objectId": "93lVCBcNsd"
    }
   ]
}

参考サイト

0 件のコメント:

コメントを投稿