2016-08-05 1 views
6

angenommen, dass die Daten dieser aussehenFirebase: Verbindende Tabellen

post: { 
    authorId: '123AA', 
    title: 'first Post', 
    body: 'yay' 
} 

author: { 
    uid: '123AA', 
    displayName: 'Richard' 
    email: '[email protected]' 
} 

ich einen Beitrag mit dem Namen des Autors machen möchten:

<div className="post"> 
    <div className="title">{post.title}</div> 
    <div className="body">{post.body}</div> 
    <div className="author-name">{post.author.displayName}</div> //problem 
</div> 

A geholt Post Artikel nur eines Autors enthält uid, aber Ich brauche die displayName des Autors. Wie beziehe ich das Autorfeld beim Abrufen der Posts? Dies ist, was ich tun, um die Beiträge zu holen jetzt:

const postsRef = firebase.database().ref('posts/') 
postsRef.on('value', (snapshot) => { 
    this.setState({posts: snapshot.val()}) 
}) 
+1

Es ist besser reactjs von den Etiketten zu entfernen, muss die Frage nichts mit React – webdeb

+1

Was zu tun, wie ich Sie wissen, kann nicht mit Firebase "Joins" machen, müssen Sie eine zweite Anfrage machen, um etwas aus einer anderen Sammlung zu bekommen –

+1

also ist das, was Menschen tun? Für jeden Beitrag, der hinzugefügt wird, machen Sie eine weitere Anfrage, um das Benutzerobjekt vom Server zu bekommen? –

Antwort

7

Nicht in Echtfeuerbasis sicher, aber ich ziemlich oft in angular2 verbinden. Hier mein Beispielcode.

import { Component, OnInit } from '@angular/core'; 
import { AngularFire } from 'angularfire2'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 

@Component({ 
    selector: 'app', 
    templateUrl: ` 
    <ul> 
     <li *ngFor="let p of posts | async"> 
      {{ p.title }} - {{ (p.authorName | async)?.displayName }} 
     </li>   
    </ul> 
` 
}) 
export class InitComponent implements OnInit { 
    posts: Observable<any[]>; 

    constructor(private af: AngularFire) {} 

    ngOnInit() { 
     this.posts = this.af.database.list('/posts') 
     .map(posts => { 
      posts.map(p => { 
       p.authorName = this.af.database.object('/authors/'+p.authorId); 
      }); 
      return posts; 
     }); 
    } 

Die Strukturdatenbank wie folgt:

/posts/postId/{authorId, title, body} 
/authors/authorId/{displayName, email} 

hoffe, das hilft