2017-04-13 6 views
0

Ich habe eine Posts und eine Comments Tabelle, wo jeder Beitrag mehrere Kommentare haben kann.Gibt die Beziehung nur zurück, wenn der Benutzer angemeldet ist?

Ich möchte eine Abfrage erstellen, die alle Beiträge erhält, und auch alle eingeloggten Benutzerkommentare. Hier

ist das, was ich bisher:

$posts = Post::select('posts.*') 
    ->with(['comments' => function($query) { 
     if (Auth::check()) { 
      $query->where('user_id', Auth::user()->id); 
     } 
    }]) 
    ->get(); 

Und mein Post.php Modellklasse sieht wie folgt aus:.

class Post extends Model 
{ 
    public function comments() 
    { 
     return $this->hasMany('App\Comment'); 
    } 
} 

Die Abfrage die korrekten Ergebnisse zurückgibt, wenn der Benutzer angemeldet ist

Aber wenn der Benutzer nicht angemeldet ist, gibt es die Kommentare aller Benutzer zurück, anstatt n zurückzugeben othing (weil der Benutzer angemeldet ist und daher keine Kommentare hat).

Wie kann ich das beheben?

Antwort

1

Es gibt zwei Möglichkeiten, an die ich denken kann.

Zuerst kann man nur die Kommentare laden, wenn der Benutzer angemeldet ist:

$posts = Post::select('posts.*'); 

if(Auth::check()) { 
    $posts->with(['comments' => function($query) { 
     $query->where('user_id', Auth::user()->id); 
    }]); 
} 

$posts = $posts->get(); 

Oder Sie könnten alle Kommentare laden, aber die user_id auf null gesetzt, wenn der Benutzer nicht angemeldet ist, da jeder Kommentar sollte. Habe eine user_id keine Kommentare werden zurückgegeben.

$posts = Post::select('posts.*') 
    ->with(['comments' => function($query) { 
      $query->where('user_id', Auth::check() ? Auth::id() : null); 
    }]) 
    ->get(); 

Der Code in der zweiten sieht sauberer IMO, aber der erste wird verhindern, dass eine unnötige Abfrage ausgeführt wird.

0

Sie können es trennen, besser lesbar und praktisch:

$posts = Post::all(); 

bei Ihrem Post Modell eine Funktion erstellen, die alle Kommentare des Benutzers zurück:

public function userComments() 
{ 
    return $this->comments->where('user_id', Auth::user()->id); 
} 

Und ich denke, in Ihrer Meinung Sie haben eine foreach, um alle Beiträge zu iterieren, in Ihrem foreach laden Sie Post Kommentare, so können Sie das tun:

+0

Ich sollte erwähnen, dass die Ergebnisse, die ich zurückgeben möchte, für meine API sind, und deshalb verwende ich keine Blade-Ansichten. Aus diesem Grund muss ich die Ergebnisse eifrig laden. – user7863944

Verwandte Themen