2016-04-24 12 views
1

Ich erstelle ein Forum Software Laravel und ich versuche, die neuesten Beiträge in einem bestimmten Thema latestPost in meinem Modell wie unten definiertVerschachtelte Eager Laden Beziehungen in Laravel

public function latestPost() { 
     return $this->hasOne('App\Post')->with('thread')->with('author')->latest(); 
    } 

Hier verwenden gemacht zuzugreifen, ist wie die verschachtelten Beziehungen in App\Post.php

public function author() 
{ 
    return $this->belongsTo('App\User', 'author_id'); 
} 

public function thread() 
{ 
    return $this->belongsTo('App\Thread', 'thread_id'); 
} 

public function topic() { 
    return $this->belongsTo('App\Topic'); 
} 
definiert sind

ich in der Lage gewesen Beiträge von Themen, Autoren etc. problemlos zugreifen zu können, und wenn ich {{ $topic->latestPost }} in meinen Ansichten habe, wird es das Objekt einschließlich relat Liste Ionenschiffe erfolgreich. Aber sobald ich versuche, einen bestimmten Teil anzuzeigen wie {{ $topic->latestPost->author->username }} ich die folgende Störung erhalte: Trying to get property of non-object

In dieser spezifischen Sicht sind Themen noch eine andere Beziehung von Kategorien wie so im Controller gezogen und bekommt $topics ein @foreach mit auf $categories->topics:

public function index() { 
    $categories = Category::orderBy('order', 'asc')->get(); 

    return view('welcome', compact('categories')); 
} 

ist hier ein Dump $categories: http://dumptext.com/H8Nq16ea

+0

verwenden können, können Sie Ihr dieses Objekt drucken '$ categories = Category :: orderBy ('order', 'asc') -> get();' und Add-up-Dump-Array-Ergebnisse in Ihrer Frage? – Qazi

+0

Hinzugefügt am unteren Rand! Es ist ziemlich lang, also habe ich es auf den Dumptext geworfen. –

+0

ca fügen Sie '-> toArray()' '' mit Ihrer dieser Zeile '$ categories = Category :: orderBy ('order', 'asc') -> get();' wie folgt ein $ categories = Category :: orderBy ('order', 'asc') -> get() -> toArray(); 'und dann die Dump-Ergebnisse angeben. – Qazi

Antwort

0

Vielleicht verschachtelt eifrig Laden verwenden, die Sie wollen.

Wechsel: return $this->hasOne('App\Post')->with('thread')->with('author')->latest();

Um dies: return $this->hasOne('App\Post')->with('thread.author')->latest();

Ich höre auch nie über die neueste() und das Ende der return-Anweisung. Vielleicht können Sie es mit orderBy wie unten gezeigt versuchen.

`return $this->hasOne('App\Post')->with('thread.author')->orderBy('id')->first;` 

Ich denke, man die orderBy verwenden können (‚id‘) -> rückwärts() Funktion, wenn das Ergebnis nicht in der Reihenfolge, die Sie wollen. Lass es mich wissen, wenn es dir geholfen hat.

+0

Wenn ich die Beziehungen auf diese Weise laden würde, würde ich den Autor des Threads und nicht den Autor des Beitrags bekommen. –

0

Sie sollten sicherstellen, dass Sie den Autor für den neuesten Beitrag haben, den Sie anzeigen möchten. Andernfalls, wenn Sie nicht für jeden Datensatz zu erwarten haben, sollten Sie versuchen:

{{ $topic->latestPost->author ? $topic->latestPost->author->username : 'No author' }} 

Zusätzlich statt:

return $this->hasOne('App\Post')->with('thread')->with('author')->latest(); 

Sie

return $this->hasOne('App\Post')->with('thread','author')->latest(); 
+0

Danke für den Tipp mit dem Kondensieren! Leider bekomme ich immer noch einen Fehler. Wenn ich nur $ topic-> latestPost zurückgebe, sind alle Informationen des Autors im Objekt, ich kann einfach nicht darauf zugreifen ... –