Fork me on GitHub

役立ちぬ開発史、それはただのブログ

覚えておくといい、ブログの時代は終わる。いつかその内、きっとたぶん…

Parseでリレーションを設定する方法

| Comments

公式ドキュメントのJavaScriptガイドのObjectsが、今回で完結します。本当はこんなにParseについて書くつもりは無かったです。Parseネタに関しては、画像のアップロードと取り出し方について書くだけの予定でした(まだ書いてない)。Parseを知らない人のことを考えて、始め方から書いてたら、記事ネタがないときや1つの記事が長くなるときにハサみだし、こうなってしまいました。(^_^;)
とりあえず、このリレーションでObjectsについて、ひと区切りつけます。

リレーション

Parseでは、1対1、1対多、多対多の全てのリレーションをサポートしています。オブジェクトが他のオブジェクトとリレーションを持つ場合としては、例えばブログで、1つのPostに複数のCommentを持たせるときなどがあります。

1対1と1対多のリレーション

1対1と1対多のリレーションするには、Parse.Objectを値として他のオブジェクトの中に保存することでモデル化できます。
以下の公式ドキュメントの例は、ブログにあるCommentはそれぞれ、1つのPostに対応している場合を想定しています。なので、1つのCommentで新しいPostを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 型の宣言
var Post = Parse.Object.extend("Post");
var Comment = Parse.Object.extend("Comment");

// postの作成
var myPost = new Post();
myPost.set("title", "I'm Hungry");
myPost.set("content", "Where should we go for lunch?");

// commentの作成
var myComment = new Comment();
myComment.set("content", "Let's do Sushirrito.");

// commentの中にpostを値のように追加 
myComment.set("parent", myPost);

// myPostとmyCommentの両方が保存
myComment.save();

Parseフレームワークは一貫性を維持するために、1ヶ所だけに参照したオブジェクトを格納します。また、以下のようにobjectIdを使うことで、オブジェクトをリンクすることができます。

1
2
3
4
var post = new Post();
post.id = "1zEcyElZ80";

myComment.set("parent", post);

リレーションしたParse.Objectからオブジェクトを取り出すには、以下のように、まずfetchしてから取り出します。

1
2
3
4
5
6
var post = fetchedComment.get("parent");
post.fetch({
  success: function(post) {
    var title = post.get("title");
  }
});

多対多のリレーション

多対多のリレーションするには、Parse.Relationを使うことでモデル化できます。リレーション・オブジェクトの中の全オブジェクトをfetchする必要が無いところを除いて、(KVSの)KeyにParse.Objectの配列を格納することと似ています。Parse.Relationは、Parse.Objectの配列よりも、より多くのオブジェクトを扱えます。
以下の公式ドキュメントの例は、ユーザーは好きなPostが複数ある場合を想定してます。なので、Userクラスの"likes"にpostを加えています。言及されてないけど、この場合Postの方には複数のユーザーを持たせてるんじゃないかな。多対多だしね。

1
2
3
4
var user = Parse.User.current();
var relation = user.relation("likes");
relation.add(post);
user.save();

Parse.Relationから、postを取り除く場合。

1
2
relation.remove(post);
user.save();

saveメソッドを呼ぶ前に、複数のaddとremoveを呼べます。

1
2
3
relation.remove(post1);
relation.remove(post2);
user.save();

Parse.Objectの配列のように、addとremoveできます。

1
2
relation.add([post1, post2, post3]);
user.save();

リレーションしたオブジェクトのリストは取り出すには、以下のように、Parse.Queryを使って取り出します。

1
2
3
4
5
relation.query().find({
  success: function(list) {
    // listは、リレーションしたpostを取得
  }
});

ある条件にマッチしたものだけを取得したい場合は、以下のように書きます。

1
2
3
4
5
6
7
var query = relation.query();
query.equalTo("title", "I'm Hungry");
query.find({
  success:function(list) {
    // listは、titleが"I'm Hungry"のリレーションしたpostを取得
  }
});

Parse.Queryについて、今回は軽く扱いましたが公式ドキュメントのガイドを読めば詳しく説明してあります。

参考先:

Relational Data(公式docs)

Comments