如何在laravel中的一条路线中绑定多个相关参数

Mah*_*mid 1 routing laravel laravel-routing laravel-5 laravel-5.3

我有两个相关模型动漫,情节

而且我已经更改了两者的RouteKeyName

在动漫模型中:

public function getRouteKeyName() 
{
    return 'slug';
}
Run Code Online (Sandbox Code Playgroud)

在情节模型中:

public function getRouteKeyName()
{
    return 'ep_num'; // episode number
}
Run Code Online (Sandbox Code Playgroud)

要观看剧集,我用这个:

路线/web.php

Route::get('play/{anime}/{episode}', 'EpisodeController@index');
Run Code Online (Sandbox Code Playgroud)

EpisodeController.php

public function index(Anime $anime, Episode $episode)
{
    return view('play')->with([
        'anime' => $anime,
        'episode' => $episode
    ]);
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我有此链接

... /播放/火影忍者/ 10

然后通过使用路由模型绑定,我将获得第一集ep_num = 10

相反,我想在ep_num = 10的情节时

anime_id = $anime->id
Run Code Online (Sandbox Code Playgroud)

有什么办法可以在RouteServiceProvider中执行此操作

我想将此应用于包含动漫和情节的所有路线,例如:

Route::delete('anime/{anime}/episode/{episode}/delete', 'EpisodeController@destroy');
Route::get('anime/{anime}/episode/{episode}/edit', 'EpisodeController@edit');
Route::put('anime/{anime}/episode/{episode}/edit', 'EpisodeController@update');
Run Code Online (Sandbox Code Playgroud)

将此添加到boot()方法内部RouteServiceProvider

Route::bind('episode', function () {
    $episode = \App\Models\Episode::where('ep_num', request()->episode);

    if (request()->route()->hasParameter('anime')) {
        $anime= \App\Models\Anime::where('slug', request()->anime)->first();
        $episode = $episode->where('anime_id', $anime->id);
    }

    return $episode->firstOrFail();
});
Run Code Online (Sandbox Code Playgroud)

Rwd*_*Rwd 7

您可以执行以下操作:

Route::bind('episode', function ($slug) {

    $episode = Episode::where('slug', $slug);

    if (request()->route()->hasParameter('anime')) {
        $episode->whereHas('anime', function ($q) {
            $q->where('slug', request()->route('anime'));
        });
    }

    return $episode->firstOrFail();
});
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!