Laravel: сортировка брендов фильтров не работает, но ошибка указывает на другую функцию (которая работает)

Я пытаюсь отображать свои категории и бренды, когда нажимаю на них (при необходимости экран). Категории работают, но не бренды. Когда я нажимаю на бренд, я получаю сообщение об ошибке «Вызов функции-члена продуктов() по нулевому значению», указывающее на строку в функции категорий ->products()->paginate(12);. Почему это происходит и как это исправить? Спасибо.

// My brand route
Route::get('catalogue/marque/{marque?}', 'App\Http\Controllers\CatalogueController@marque')->name('catalogue.marque');

// My brand function
function marque($slug)
{
    $products = \App\Models\Brand::where('slug', $slug)
                 ->first()
                 ->products()->paginate(12);

    $categories = \App\Models\Category::all();
    $brands = \App\Models\Brand::all();

    return view('catalogue.index', compact('products', 'categories', 'brands'));
}

// My view
<ul>
@foreach($brands as $brand)
    <li><a href = "{{ route('catalogue.marque', ['slug' => $brand->slug]) }}">{{ $brand->name }}</a></li>
@endforeach
</ul>

ошибка «Вызов функции-члена продуктов() по нулевому значению» очень очевидна. \App\Models\Brand::where('slug', $slug)->first() возвращает NULL, и вы пытаетесь вызвать ->products() по нему

kris gjika 04.07.2024 11:35

используйте это route('catalogue.marque', ['marque' => $brand->slug]) в себе href.

Subha 04.07.2024 11:42

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

Subha 04.07.2024 12:13

@lara, я опубликовала свой ответ, пожалуйста, ознакомьтесь со всеми пунктами, которые я упомянул о том, как это сделать правильно. Что вы делаете. Пожалуйста, проверьте и дайте мне знать.

Subha 04.07.2024 12:35

@lara, вместо назначения $marque = null вы также можете назначить значение по умолчанию, отличное от нуля, в случае отсутствия соответствующего параметра.

Subha 04.07.2024 12:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, хотя я дал ответ в своих комментариях, я все же думаю, что мне нужно прояснить некоторые ключевые моменты кода.

Вот эти моменты.

  1. Когда вы используете optional-parameter(т.е. {marque?}) в маршрутах, вам необходимо правильно сопоставить параметр с соответствующим методом контроллера (в вашем случае marque($slug)), вот так.

    function marque(?string $marque = null) { ....... ..... }

    Для получения дополнительной информации проверьте ссылку на документы

    https://laravel.com/docs/11.x/routing#parameters-optional-parameters

  2. Когда вы передаете значение параметра route('catalogue.marque', ['slug' => $brand->slug]), оно не совпадает с route-defination. Таким образом, внутри метода marque($slug) он не получает никаких совпадающих записей через $slug во время выборки модели Brand и возвращает null. Следовательно, когда вы пытаетесь использовать paginate(12) для полученного результата, вы получаете эту ошибку.

    Call to a member function products() on null

Другие вопросы по теме