2014-11-12 5 views
5

Ich frage mich, ob es möglich ist, eine Beziehung mit Laravels Route Modell Bindung zurückgeben?Laravel Route Modell Bindung mit Beziehung

Say ist ein Benutzermodell mit einer Beziehung "Freunde" zu anderen Benutzern haben, und ich möchte sowohl die Benutzerinformationen und die Beziehung von einer Route oder Controller zurückgeben.

zB für die Strecke domain.tld/user/123

Route::model('user', 'User'); 

Route::get('/user/{user}', function(User $user) { 

    return Response::json($user); 

}); 

dies wird die Benutzer Informationen in Ordnung zurückkehrt mir, aber ich will auch die Beziehungen, ist es ein einfacher/richtiger Weg, dies zu tun?

Ich weiß, ich kann dies tun

Route::get('/user/{user}', function((User $user) { 

    return Response::json(User::find($user['id'])->with('friends')->get()); 

}); 

oder

Route::get('/user/{id}', function(($id) { 

    return Response::json(User::find($id)->with('friends')->get()); 

}); 

aber ich vermute, es kann eine bessere Art und Weise sein, Dank im Voraus

Keith

Antwort

5

können Sie bevölkern die Eigenschaft $with im Benutzermodell. Wie so;

protected $with = ['friends']; 

Dadurch werden automatisch die Beziehungsdaten für Sie automatisch geladen.

Bitte beachten Sie: Dies wird es für jede Benutzermodellabfrage tun.

Wenn Sie nicht wollen, dass Freunde die ganze Zeit geladen werden, dann können Sie sie an den Parameter innerhalb Ihrer Route binden, so;

Route::bind('user_id', function($id) { 
    return User::with('friends')->findOrFail($id); 
}); 

Route::get('/user/{user_id}', '[email protected]'); 
3

Sie wollen nicht zu eifrig Last Beziehungen auf jede Abfrage wie Matt Burrow schon sagt, nur um es in einem Kontext zur Verfügung zu haben. Dies ist ineffizient.

Stattdessen können Sie in Ihrer Controller-Aktion Beziehungen "on demand" laden, wenn Sie sie benötigen. Also, wenn Sie verwenden Route-Modell eine User Instanz zu Ihrem Controller-Aktion Bindung bereitzustellen, aber Sie wollen auch die friends Beziehung, können Sie dies tun:

class UserController extends Controller 
{ 
    public function show(User $user) 
    { 
     $user->load('friends'); 

     return view('user.show', compact('user')); 
    } 
} 
+0

Dank dafür. Sie können 'load' auch ein wenig wie' mit' verwenden, zum Beispiel als Teil einer komplexeren Abfrage wie: 'return $ modules-> load (['questions', 'questions.results' => function ($ q) use ($ user) {return $ q-> wo ('user_id', $ user-> id);}]); ' – Djave

+4

@Djave' load() 'dient zum Laden von Beziehungen _nach_ einer Abfrage wurde 'mit () 'dient zum Einfügen von Beziehungen als Teil einer Abfrage. –

Verwandte Themen