我希望实现类似于Laravel 4中this question中提出的问题,其中player/
资源可以有多个team/
,并且反之亦然。
在理想的世界里,我可以查询
players/1/teams
并取回一些像这样的JSON:
{ player: {
id: 1, name: 'Bob', sport: 'Curling', teams: [
{ id: 1, name: 'Northern Curling Soc.', age: 2},
{ id:2, name: 'Southern Curling Soc.', age: 4 }
]
}
或
teams/{id}/players
并获得相关信息。
显然,如果我使用Laravel的观点,我可以简单地调用$player->teams
,一切都会好的,但这是针对JSON API的,所以这一切都需要预先设定。
我还需要能够对相关结果进行分页,尽管这可能是一个不同的问题。
我怎么能用Laravel做到这一点?
感谢您的帮助!
答案 0 :(得分:5)
Laravel 4增加了对嵌套资源路由的支持。他们非常好,看起来非常适合这个。
基本上,除了你的"直接"资源控制器,您需要为嵌套资源添加路由。在这种情况下,除了:
Route::resource('players', 'PlayersController'); // players/#
Route::resource('teams', 'TeamsController'); // teams/#
......你需要:
Route::resource('players.teams', 'PlayerTeamsController'); // players/#/teams/#
Route::resource('teams.players', 'TeamPlayersController'); // teams/#/player/#
然后在您的控制器中,通常接收单个ID作为参数的方法现在将收到两个(订单由您的路由定义):
class PlayerTeamsController extends Controller {
public function show($player_id, $team_id) {
}
}
然后,您可以使用继承来避免控制器之间的代码冗余。
答案 1 :(得分:1)
通过API,只需包含关系并返回对象(在laravel 4中)。 L4将自动格式化JSON输出的数据。
return Player::with( [ 'teams' ] )->get();
它将为您提供几乎完全符合您的格式:)