2014-11-12 2 views
5

Мне интересно, можно ли вернуть отношения с laravels. Перемещение модели маршрута?Laravel привязка модели маршрута с relaionship

Скажите, что у пользователя есть модель с дружескими отношениями с другими пользователями, и я хочу вернуть как информацию пользователя, так и отношения с маршрутом или контроллером.

например, для маршрута domain.tld/user/123

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

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

    return Response::json($user); 

}); 

это вернет мне информацию пользователя штраф, но я также хочу отношений, есть ли простой/правильный способ сделать это?

Я знаю, что могу это сделать

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

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

}); 

или

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

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

}); 

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

Keith

ответ

5

Вы можете заполнить $with Недвижимость в модели пользователя. Вот так;

protected $with = ['friends']; 

Это автоматически загрузит данные о взаимоотношениях для вас.

Обращаем ваше внимание, что: Это сделает это для каждого запроса пользовательской модели.

Если вы не хотите, чтобы друзья загружались все время, вы можете привязать его к параметру в вашем маршруте, например;

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

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

Вы не хотите нетерпеливые нагрузки отношений на каждый запрос как Matt Burrow предполагает, только чтобы он доступен в одном контексте. Это неэффективно.

Вместо этого в действии вашего контроллера вы можете загружать отношения «по требованию», когда они вам понадобятся. Так что если вы используете маршрут-модель связывание для обеспечения User экземпляра вашего действия контроллера, но вы также хотите friends отношений, вы можете сделать это:

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

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

Спасибо за это. Вы можете также использовать 'load' немного как' with', например, как часть более сложного запроса типа: 'return $ module-> load (['questions', 'questions.results' => function ($ q) use ($ user) {return $ q-> где ('user_id', $ user-> id);}]); ' – Djave

+4

@Djave' load() 'для загрузки отношений _after_ запрос был выполнен с') 'для включения отношений как часть запроса. –

Смежные вопросы