4

我想实现类似于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 }
    ] 
}

或者

teams/{id}/players并获得相关性。

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

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

我怎样才能用 Laravel 做到这一点?

谢谢你的帮助!

4

2 回答 2

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

    }

}

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

于 2014-03-30T21:49:18.913 回答
1

通过 API,只需包含关系并返回对象(在 laravel 4 中)。L4 将自动格式化 JSON 输出的数据。

return Player::with( [ 'teams' ] )->get();

它会给你几乎正是你所追求的格式:)

于 2013-08-07T14:05:52.623 回答