【问题标题】:How do implement many-to-many relationships in a Laravel 4 RESTful API如何在 Laravel 4 RESTful API 中实现多对多关系
【发布时间】:2013-08-08 22:53:22
【问题描述】:

我想实现类似于 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 做到这一点?

感谢您的帮助!

【问题讨论】:

    标签: php rest laravel


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我一直在其他地方这样做。 JSON很棒!问题是,我如何以通用方式路由到此(我不想为我的所有资源设置和维护单独的路由)?
    • 如同,播放器控制器是否响应播放器本身的资源?又名 player/1/teams player/1/clubs .etc?
    • 这是一个单独的问题,真的 - 但我建议不要这样做。更好的方法是查询特定的团队,也就是:GET /teams?player_id=5 而不是 GET /player/5/teams/ 它让你的 API 更简单,你的 routes/controllers.etc。更易于维护,并且是各种文章中推荐的方法。我建议阅读教狗休息(谷歌搜索)。
    • @Oddman 表示关系的 player/5/teams 方法实际上在 Teach a dog to REST 中被推荐。查询参数更适合过滤器(获取所有超过 25 岁的玩家 = /players?min_age=25)。我正在寻找一种方法来使用 Laravel 自己做到这一点。
    • @idmadj 哇,我一定错过了!如果你在 Laravel 中得到一个好的解决方案,让我知道,会很想看到它:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2019-02-02
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多