Firebase FireBaseにて、テーブルの関連付け1対多


Firebaseの関連付けについて、ソースから説明してみます。
日本語のblogには記事が見当たらなかったため

結論
子テーブルを保存するときに、その親テーブルのidはわかっているはず。
そのidをセットして保存する

Thoughtが複数のCommentを1対多で持っています


//インスタンスをメンバにしておく
let firestore = Firestore.firestore()


//commentボタンがタップされたときの処理
    @IBAction func addCommentTapped(_ sender: Any) {

        //commentのテキストフィールドの値がnilで無いことをチェック
        guard let commentTxt = addCommentText.text else{ return }
        
//ここでtransactionを利用する
        firestore.runTransaction({ (transaction, error) -> Any? in
            
//DocumentSnapshot型のプロパティを用意しておくのがポイント
            let thoughtDocument: DocumentSnapshot
            
//エラー処理
            do{
                try thoughtDocument =

//ここで親テーブルのdocumentIdが取得できる
 transaction.getDocument(self.firestore.collection(THOUGHTS_REF)
                    .document(self.thought.documentId))
            }catch let error as NSError {
                debugPrint(error)
                return nil
            }
        
            guard let oldNumComments = thoughtDocument.data()[NUM_COMMENTS] as? Int else
            { return nil }
            
//transactionのに値をセットする
//userIdもセットする より浅い階層からアクセスできるようにしておく
            transaction.setData([
                COMMENT_TXT: commentTxt,
                TIMESTAMP: FieldValue.serverTimestamp(),
                USERNAME: self.username,

//user_idを保持するときはいつもこれを利用します。
                USER_ID: Auth.auth().currentUser?.uid ?? ""
                
            ], forDocument: newCommentRef)
            
            return nil
        }){(object, error) in
            if let error = error{
                debugPrint(error)
            }else{

//ここに入ったということは、正常に保存されているはず
//テキストフィールドの値を空にしておいて、次の処理に備える
                self.addCommentText.text = ""
            }
        }
    }

 

ポイントは

DocumentSnapshot クラスを利用すること

runTransactionメソッドを利用すること

Firebaseを利用すると、随分と開発が楽になると思いますし、モバイルファーストで新しいサービスは、Firebaseで先行開発する手法も広がるのでは無いかと個人的には思います。

transactionメソッドについての公式サイト