2017-03-02 3 views
0

mehrere verwandte Parameter in einer Route binden ich zwei miteinander verwandte Modelle Anime, Folge habenwie in Laravel

und ich habe die RouteKeyName für beide

In Anime Modell geändert:

public function getRouteKeyName() 
{ 
    return 'slug'; 
} 

In Episode Modell:

public function getRouteKeyName() 
{ 
    return 'ep_num'; // episode number 
} 

eine Folge zu sehen, verwende ich diese:

Routen/web.php

Route::get('play/{anime}/{episode}', '[email protected]'); 

EpisodeController.php

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

zum Beispiel, wenn ich diesen Link

.../play/naruto/10 haben

dann 10 von Routenmodell Bindung i wird die erste Folge mit ep_num haben = 10

Stattdessen möchte ich die Episode mit ep_num haben = wenn

anime_id = $anime->id 

ist es eine Möglichkeit, diese

innen RouteServiceProvider zu tun

ich will dies sowohl für alle Strecken anzuwenden anime und Folge enthalten, wie:

Route::delete('anime/{anime}/episode/{episode}/delete', '[email protected]'); 
Route::get('anime/{anime}/episode/{episode}/edit', '[email protected]'); 
Route::put('anime/{anime}/episode/{episode}/edit', '[email protected]'); 

SOLUTION

dies innerhalb 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(); 
}); 
+0

Es ist nicht ganz klar, was Sie wollen. Was meinst du mit "anime_id = $ anime-> id"? –

+0

anime_id ist ein Fremdschlüssel in der Episodentabelle und ich möchte, dass er der ID des Animes in der Route entspricht. –

+0

Ok, und ist die Beziehung in deinem 'Episoden'-Modell für Anime, nur 'Anime' genannt? –

Antwort

3

zu boot() Methode hinzufügen Sie so etwas wie tun könnte:

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(); 
}); 

hoffe, das hilft!

+0

Das hat mir sehr geholfen, Danke –