Маршрут Laravel с несколькими параметрами - Как получить правильный результат базы данных - PullRequest
0 голосов
/ 17 октября 2019

Я пару недель изучаю Laravel и столкнулся с проблемой, на которую я не могу найти ответ самостоятельно или через Интернет.

Я создаю веб-сайт каталога с URL-адресами, структурированными так:

  1. directory.co.uk / parks
  2. directory.co.uk / parks / {county-name}
  3. directory.co.uk / parks / {county-name} / {park-name}

Поскольку {park-name} не уникален, я пытаюсьвернуть страницу для отдельного парка. Контроллер должен искать county. id, используя county. slug и , затем park. id, используя park. county_id иpark. slug.

У меня есть маршруты в файле web.php, такие как:

Route::get('/parks','ParksController@index')->name('parks');
Route::get('/parks/{county}/{park}','ParksController@show')->name('park');

У меня есть модели парков и округов, а также (отношения отношения ownTo и hasMany установлены междудва).

У меня это есть в обеих моделях:

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

Тогда в моем ParksController я в растерянности. В настоящее время у меня есть:

public function show(Counties $county, Parks $park)
    {
        //return $park;
        //dd($park);
        return view('parks.park', ['park'=>$park]);
    }

Я также пробовал не-Eloquent способ:

public function show($county_slug,$park_slug)
    {
        $county = DB::table('counties')->where('seo_url',$county_slug)->get();

        $county_id = $county->pluck('id');

        $park = DB::table('parks')->where('county_id', $county_id)->where('seo_url', $park_slug)->get();

        //dd($county_id);
        //return $park;
        return view('parks.park', ['park'=>$park]);
    }

Это возвращает ошибку 404. Любая помощь приветствуется. (Я много читал о привязке модели Route, но не вижу примеров, подобных моему.)

1 Ответ

0 голосов
/ 17 октября 2019

Laravel имеет недокументированную особенность в своей явной привязке модели , где обратному вызову может быть дан текущий маршрут, для которого предназначена привязка. Это может позволить вам получить доступ к другим параметрам и использовать их для добавления условных выражений.

Router::bind('park', static function ($value, Route $route) {
    $query = Parks::where('seo_url', '=', $value);

    if ($route->hasParameter('county')) {
        $county = $route->parameter('county');

        $query->where('county_id', '=', $county instanceof Counties ? $county->id : $county);
    }

    return $query->first() ?? abort(404);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...