2017-01-11 9 views
1

私のように見えます、クエリビルダから、特定の構造を取得しようとしています:LaravelネストされたクエリビルダJSONレスポンス

{ 
    "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 
    } 
    } 
} 

あなたが見ることができるように、私は入れ子にする関係のために必要な、この場合、ユーザーにロールへ。

User::with('role')と熱心な負荷を使用してこの構造を得ることができます。

私はこのクエリを持っていますが、すべてを1つの列に返します。 クエリビルダを使用して同じ構造を得る方法はありますか? eager load bad practiceを使用していますか?

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

ありがとうございます。

答えて

2

Laravel Eloquent Docsを参照してください。

もちろん、クエリービルダーや生のクエリーでも同じ結果を得ることができますが、その日の終わりには、次のような結果が得られます。維持不能なアプリ。

だから、私はと一緒にあなたをお勧めします:

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

多対多リレーションシップを設定している場合は、リレーションメソッドを呼び出すことによって、クエリされたモデルに追加することができます。お使いのモデルで

、あなたが関係を定義することができます:あなたのコントローラで

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

を、あなたはこのようにそれにアクセスすることができます。

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

今すぐあなたのユーザモデルが接続されているすべての役割が含まれておりますでしょうそれをあなたの望むやり方で出力することができます。

は、私は熱心な負荷が最善の方法だと思います

0

イーガーローディングは「Laravel」道のベストプラクティスでしょう。あなたがRoleモデルを持っていると仮定して、あなたのUserモデルが関係を持っています

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

あなたがして、あなたの所望の応答を得ることができます。

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

return response()->json(['status' => 'success', 'data' => $user]); 
関連する問題