Как явно указать маршрутизацию привязки модели для получения только связанных категорий? У меня есть следующий файл web.php:

Route::get('/catalog/{category}', [CategoryController::class, 'index'])->name('category.index');
Route::get('/catalog/{category}/{subcategory}', [SubcategoryController::class, 'index'])->name('subcategory.index');
Route::get('/catalog/{category}/{subcategory}/{subsubcategory}', [SubsubcategoryController::class, 'index'])->name('subsubcategory.index');

Контроллер подкатегории:

public function index(Category $category, Subcategory $subcategory, Subsubcategory $subsubcategory)
{
    $subsubcategory->load('product')->loadCount('product');
    $products = Product::where('subsubcategory_id', $subsubcategory->id)->orderByRaw('product_order = 0, product_order')->get();
 return view('subsubcategory.index', compact('subsubcategory', 'products'));
}

И рассматриваемая модель:

public function subcategory()
{
    return $this->belongsTo(Subcategory::class);
}

public function category()
{
    return $this->belongsTo(Category::class);
}

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

Частично работает нормально. Он загружает все слага, но проблема в том, что, скажем, у меня есть подкатегория Samsung с ее родительскими категориями, такими как:

каталог / мобильные телефоны / android / samsung

Всякий раз, когда я изменяю URL-адрес из каталога / мобильных телефонов / android / samsung в каталог / мобильные-телефоны / ios / samsung, он работает, где на самом деле этого не должно быть. Как справиться со вторым сценарием?

PS: это также применимо, если я открываю подкатегорию и меняю ярлык категории. Но, очевидно, если категории верхнего уровня не существует, он выбросит 404.

0
Coverdale101 25 Май 2021 в 01:31
Попробуйте перевернуть перечисленные маршруты, изменив их на этот порядок вместо `` `` Route :: get ('/ catalog / {category} / {subcategory} / {subsubcategory}', [SubsubcategoryController :: class, 'index']) -> name ('subsubcategory.index'); Route :: get ('/ catalog / {category} / {subcategory}', [SubcategoryController :: class, 'index']) -> name ('subcategory.index'); Route :: get ('/ catalog / {category}', [CategoryController :: class, 'index']) -> name ('category.index'); `` ''
 – 
Tanner
25 Май 2021 в 06:14
Спасибо за ответ, но он по-прежнему работает так же
 – 
Coverdale101
25 Май 2021 в 18:07

1 ответ

Лучший ответ

Вы можете немного изучить документацию в отношении явной привязки модели маршрута и настройки логики разрешения, чтобы получить некоторые идеи.
https://laravel.com/docs/8.x/ routing # customizing-the-resolution-logic

Следующее не проверено, и я делаю некоторые предположения о структурах ваших таблиц, но я думаю, что это должно дать вам базовое представление о том, как вы можете изменить привязку модели маршрута в соответствии с вашими потребностями. Та же концепция может быть применена к привязке {subcategory}, но с одной проверкой связи меньше.

< Сильный > App / Провайдеры / RouteServiceProvider.php

public function boot()
{
    // ...default code...

    // add custom resolution for binding 'subsubcategory'
    Route::bind('subsubcategory', function($slug, $route) {

        // check to see if category exists
        if ($category = Category::where('slug',$route->parameter('category'))->first()) {

            // check to see if subcategory exists under category
            if ($subcategory = $category->subcategories()->where('slug',$route->parameter('subcategory'))->first()) {

                // check to see if subsubcategory exists under subcategory
                if ($subsubcategory = $subcategory->subsubcategories()->where('slug',$slug)->first()) {

                    // success, proper relationship exists
                    return $subsubcategory;
                }
            }
        }

        // fail (404) if we get here
        throw new ModelNotFoundException();
    });
}

Однако я отмечу, что это вызывает ряд отдельных обращений к базе данных. Если оптимизация вызывает беспокойство, могут быть более эффективные способы достижения той же цели с помощью других методов.

0
matticustard 25 Май 2021 в 10:23