laravel 如何在一条路由中绑定多个相关参数
how to bind multiple related parameters in one route in laravel
我有两个相关的模型动漫,剧集
并且我已经更改了他们两个的 RouteKeyName
在动漫模型中:
public function getRouteKeyName()
{
return 'slug';
}
在情节模型中:
public function getRouteKeyName()
{
return 'ep_num'; // episode number
}
要查看剧集,我使用这个:
routes/web.php
Route::get('play/{anime}/{episode}', 'EpisodeController@index');
EpisodeController.php
public function index(Anime $anime, Episode $episode)
{
return view('play')->with([
'anime' => $anime,
'episode' => $episode
]);
}
例如,如果我有这个 link
.../play/naruto/10
然后通过使用路由模型绑定,我将获得 ep_num=10
的第一集
相反,我想在
时播放 ep_num=10 的剧集
anime_id = $anime->id
有什么方法可以在 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');
你可以这样做:
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();
});
希望对您有所帮助!
我有两个相关的模型动漫,剧集
并且我已经更改了他们两个的 RouteKeyName
在动漫模型中:
public function getRouteKeyName()
{
return 'slug';
}
在情节模型中:
public function getRouteKeyName()
{
return 'ep_num'; // episode number
}
要查看剧集,我使用这个:
routes/web.php
Route::get('play/{anime}/{episode}', 'EpisodeController@index');
EpisodeController.php
public function index(Anime $anime, Episode $episode)
{
return view('play')->with([
'anime' => $anime,
'episode' => $episode
]);
}
例如,如果我有这个 link
.../play/naruto/10
然后通过使用路由模型绑定,我将获得 ep_num=10
的第一集相反,我想在
时播放 ep_num=10 的剧集anime_id = $anime->id
有什么方法可以在 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');
你可以这样做:
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();
});
希望对您有所帮助!