2016-12-22 2 views
2

Ich habe ein kleines Problem aber es frustriert mich sehr.Wie man das erste Einzelteil in der Ansammlung erhält, wenn man eins-zu-viele Beziehung verwendet

Ich habe zwei Tabellen
1. Benutzer
2. Beiträge

Der Benutzer können viele Beiträge haben und die Post gehört zu einem Benutzer

Meine Frage: wie die erste erhalten Post bei der Eingabe der Beziehung?

public function index() { 
$user = User::find(1); 

// here it will return all posts 

$user->with('posts'); 

    return view('home.index',compact('user')); 
} 

By the way: ich benutzte Schließung aber es hat nicht funktioniert ... es zurückgeben alle Benutzer mit den Beiträgen

public function index() 
    { 

     $user = User::find(1); 


     $user = $user->with(['posts' => function ($query) { 
      $query->first(); 
     }])->get(); 

     return $user ; 
     return view('home.index',compact('user')); 
    } 

und das Ergebnis ist wie folgt aus:

[ 
{ 
"id": 1, 
"name": "Barney Walter", 
"email": "wuckert.m[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 2, 
"name": "Dr. Makenzie Rutherford", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 3, 
"name": "Ernesto Shanahan", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 4, 
"name": "Rosalinda Cartwright", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [] 
}, 
{ 
"id": 5, 
"name": "Kyleigh Willms", 
"email": "[email protected]", 
"created_at": "2016-12-22 10:48:45", 
"updated_at": "2016-12-22 10:48:45", 
"posts": [ 
{ 
"id": 1, 
"user_id": 5, 
"name": "Malcolm Simonis", 
"title": "Autem quidem quia earum ipsam. A a commodi id adipisci quia minima iste numquam. Eum eius odit porro veniam. Et iure occaecati sapiente minima et beatae. Labore eius labore accusamus sapiente sed eveniet accusamus.", 
"is_published": 1, 
"created_at": "2016-12-22 10:54:14", 
"updated_at": "2016-12-22 10:54:14" 
} 
] 
} 
] 

jede Hilfe über das ... bitte !!

+0

Ich bin nicht ganz sicher, welche Antwort zu geben, weil Ihre Frage unklar ist. Was sollte das beabsichtigte Ergebnis sein? Möchten Sie die Benutzer basierend auf einem oder mehreren Posts filtern oder möchten Sie alle Benutzer und nur ihren ersten Post anzeigen? – Luceos

+0

Nicht Laravel so viel, aber basierend auf Logic, kann ich sagen, dass Sie Paginierung oder Pageed Query für Ihre Posts Ergebnisse versuchen können. und dann kannst du herausfinden, wie viele Beiträge du brauchst. Etwas wie [dies] (http://stackoverflow.com/questions/21255508/select-the-first-10-rows-laravel-eloquent?answertab=active#tab-top) –

+0

ja ... Ich möchte zeigen bestimmter Benutzer und nur sein erster Beitrag? – hikefd

Antwort

0

Try take() verwenden:

$user = User::with(['posts' => function ($query) { 
      $query->orderBy('created_at', 'asc')->take(1); 
     }])->first(); 

Und orderBy('created_at', 'asc') wird Ergebnis sortieren, so dass Sie den ersten Beitrag werde folgen.

+0

Das ist fast richtig. Sie müssen nur die Methode 'first()' durch die Methode 'find ($ id)' für das Benutzermodell ersetzen. Die 'with()' Schließung sieht für mich richtig aus. –

0

Versuchen Sie dies, Sie erhalten nur 1 Beitrag.

$user = User::with('posts')->first(); 
$user->setRelation('posts', $business->posts->take(1)); 
0

Wenn Sie ein Modell object von post statt collection dann können Sie eine neue hasOne Beziehung in User Modell als definieren:

public function post() 
{ 
    return $this->hasOne('App\Post'); 
} 

Und dann können Sie abfragen, es als:

$user = User::where('id', 1)->with('post')->first(); 
Verwandte Themen