2013-08-07 97 views
4

我想實現類似於Laravel 4中this question中提出的內容,其中player/資源可以有多個team/,反之亦然。如何在Laravel 4 RESTful API中實現多對多關係

在一個理想的世界,我將能夠查詢

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做到這一點?

感謝您的幫助!

回答

3

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/# 

然後在你的控制器,通常接受一個I​​D爲參數現在將收到兩個方法(在訂單由您的路線定義):

class PlayerTeamsController extends Controller { 

    public function show($player_id, $team_id) { 

    } 

} 

然後,您可以使用繼承來避免控制器之間的代碼冗餘。

1

通過API,只需包含關係並返回對象(在laravel 4中)。 L4會自動格式化JSON輸出的數據。

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

它會給你幾乎完全格式化你以後:)

+0

謝謝。我一直在其他地方做這個。 JSON非常棒!問題是,我如何以一種廣義的方式(我不想爲所有資源建立和維護單獨的路線)進行路由? – djb

+0

如同,玩家控制器是否對玩家本身的資源做出了迴應?又名,球員/ 1 /球員/ 1 /俱樂部.etc? – Oddman

+0

是的,正是這個 – djb