2017-01-11 2 views
1

Я пытаюсь получить определенную структуру из конструктора запросов, который выглядит как:Laravel Уплотненного Query Builder Json Response

{ 
    "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').

У меня есть этот запрос, но он возвращает все в одном столбце. Есть ли способ получить эту же структуру с помощью построителя запросов? Является ли использование жадной нагрузки плохой практикой?

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

Заранее спасибо.

ответ

2

Я бы сказал, что жадная загрузка является лучшей практикой. Это читаемый и поддерживаемый способ работы с данными, он возвращает удобные структурированные данные и т. Д.

Конечно, вы можете добиться того же результата с Query Builder и даже с необработанными запросами, но в конце дня вы получите незаменимое приложение.

Итак, я рекомендовал бы вам остаться с:

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); 

Теперь ваша модель пользователя будет содержать все подключенные к нему роли и вы может выводить его по вашему желанию.

См Laravel Eloquent Docs

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]);