2017-01-11 7 views
1

Ich versuche, eine bestimmte Struktur aus einem Query Builder zu erhalten, die aussieht wie:Laravel Nested Query Builder Json Antwort

{ 
    "status": "success", 
    "data": { 
    "id": 1, 
    "email": "[email protected]", 
    "birth_date": "1992-08-17", 
    "gender": "M", 
    "is_active": 1, 
    "role": { 
     "id": 1, 
     "name": "Admin", 
     "created_at": "2017-01-11 15:16:14", 
     "updated_at": null 
    } 
    } 
} 

Wie Sie sehen können, ich brauche für die Beziehung verschachtelt werden, in diesem Fall Benutzer zu Rollen.

Ich kann diese Struktur mit eifriger Last mit User::with('role') bekommen.

Ich habe diese Abfrage, aber es gibt alles in einer Spalte zurück. Gibt es eine Möglichkeit, die gleiche Struktur mit Abfrage-Generator zu bekommen? Wird eifrige Last schlechte Übung?

User::select('users.id', 'users.full_name') 
    ->join('roles as r', 'r.id', '=', 'users.role_id') 
    ->where('users.id', $user_id) 
    ->get(); 

Vielen Dank im Voraus.

Antwort

2

Ich würde sagen, eifrig Laden die beste Praxis ist. Es ist lesbar und pflegeleicht mit Daten zu arbeiten, es liefert bequem strukturierte Daten usw.

Natürlich können Sie das gleiche Ergebnis mit Query Builder und sogar rohe Abfragen erreichen, aber am Ende des Tages werden Sie erhalten eine nicht wartbare App

Also, würde ich Ihnen empfehlen, mit zu bleiben:

User::with('role')->get(); 
0

Wenn Sie eine Viele-zu-Viele-Beziehung eingerichtet haben, können Sie sie einfach zu den abgefragten Modellen hinzufügen, indem Sie die relation-Methode aufrufen.

In Ihrem Modell können Sie die Beziehung definieren:

public function roles() { 
    return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id'); 
} 

In Ihrem Controller, können Sie es wie folgt zugreifen können:

$user = User::find(id); 
$user->roles; 
return response()->json($user); 

Jetzt enthält Ihre Benutzermodell alle angeschlossenen Rollen und Sie kann es in Ihrer gewünschten Weise ausgeben.

Siehe Laravel Eloquent Docs

0

Eager Laden best practice Weg der "Laravel" wäre. Angenommen, Sie haben ein Role Modell und User Modell hat die Beziehung:

public function role() 
{ 
    return $this->belongsTo(Role::class); 
} 

Sie können Ihre gewünschte Antwort mit bekommen:

$user = User::with('role')->find($user_id); 

return response()->json(['status' => 'success', 'data' => $user]);