如何在Laravel 4 RESTful API中实现多对多关系

djb*_*djb 4 php rest laravel

我想在Laravel 4中实现与此问题中提到的内容类似的内容,其中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 }
    ] 
}
Run Code Online (Sandbox Code Playgroud)

要么

teams/{id}/players 得到相关的.

显然,如果我使用Laravel的视图,我可以简单地调用$player->teams,一切都会很好,但这是针对JSON API的,所以这一切都需要预先确定.

我还需要能够对相关结果进行分页,尽管这可能是一个不同的问题.

我怎么能用Laravel做到这一点?

谢谢你的帮助!

idm*_*adj 5

Laravel 4增加了对嵌套资源路由的支持.他们非常好,看起来非常适合这个.

基本上,除了"直接"资源控制器之外,还需要为嵌套资源添加路由.在这种情况下,除了:

Route::resource('players', 'PlayersController');  // players/#
Route::resource('teams', 'TeamsController');      // teams/#
Run Code Online (Sandbox Code Playgroud)

......你需要:

Route::resource('players.teams', 'PlayerTeamsController');  // players/#/teams/#
Route::resource('teams.players', 'TeamPlayersController');  // teams/#/player/#
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器中,通常接收单个ID作为参数的方法现在将收到两个(订单由您的路由定义):

class PlayerTeamsController extends Controller {

    public function show($player_id, $team_id) {

    }

}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用继承来避免控制器之间的代码冗余.