2018-08-18に更新

Firestoreの参照型によるリレーションを試す

FirebaseのFiresotreはNoSQLのため、コレクションの下にサブコレクションを登録するような形でデータをネストして登録していくことができます。ただ、これではRDBでやっているようなリレーションが実装できず、データが色々なところに分散してしまって非常に使いづらいです。一応リレーションもできるっぽいので、ちょっと試してみました。(ちなみに成功したとは言っていません)

※2018/8月現在、Firestoreがβバージョンのタイミングの記事となります。

ちなみに、もうちょっと詳しく考察されている記事があります。

Cloud FirestoreのSubCollectionとQueryっていつ使うの問題

多分これのリレーションシップ参照型というところの話です。上記の記事ではManyToMany, hasManyあたりの話をしていると思いますが、今回試したのはbelongsToの話になります。

参照型

Firestoreに格納するデータには色々型があります。

https://firebase.google.com/docs/firestore/manage-data/data-types?hl=ja

この中を見ると「参照」という型があります。が、概念的なものが書かれているだけで、他のページを探してみても説明が見つかりません。(ただ見つけられていないだけか、βだからかは分かりません)

そのためとりあえずこれを使って1:1のリレーションができるか試してみました。

そもそも参照型と何か

データを追加するところのマニュアルを見てみると、addした後にdocRefという値が取得できています。もしかするとこれかな? と思い、別のデータを保存する際にこのdocRefをそのまま代入して保存してみました。

      // userのdocRefをそのまま入れる 
      this.post.user = this.$store.state.user;
      db
        .collection("posts")
        .add(this.post)
        .then(docRef => {
          this.posts = getPosts();
        })
        .catch(error => console.log(error));

Firebaseのconsoleで見てみるとちゃんと入っていました。

body: "aaaa"
user: /users/scQa34jZbdF2mpuVcMMV

という感じで、参照型の保存自体はこんな感じでできるようです。

リレーションデータの取得

取得までは試していません。取得したデータの参照型の値にはDocumentReferenceというクラスのインスタンスが入っているようなのですが、僕の環境ではうまく動きませんでした。多分get()で取ってこれると思うのですが、うまくいきませんでした。よくよく考えるとそこでもリモートのデータを取ってくるはずなので、Promiseのまま使おうとしていた可能性がありそうです。とにかく面倒になったのと時間が不足してきたのでそこでやめました。

面倒ですね…!!!! ただこのあたりも改善が来ると思うので継続して様子を見ていきたいですね。


dala00

Crieitの開発者です。 主にLAMPで開発しているSEです(在宅&常駐)。大体10年程。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, CakePHP3, Laravel5, JavaScript 趣味:Elixir, Phoenix, Node, Vue等色々

Crieitはαバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
関連記事

コメント