Я пытаюсь отображать свои категории и бренды, когда нажимаю на них (при необходимости экран). Категории работают, но не бренды. Когда я нажимаю на бренд, я получаю сообщение об ошибке «Вызов функции-члена продуктов() по нулевому значению», указывающее на строку в функции категорий ->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>
используйте это route('catalogue.marque', ['marque' => $brand->slug])
в себе href
.
@lara, спасибо за подтверждение. Но есть еще несколько ключевых моментов, которые я хочу прояснить в своем ответе, который я опубликую через несколько минут.
@lara, я опубликовала свой ответ, пожалуйста, ознакомьтесь со всеми пунктами, которые я упомянул о том, как это сделать правильно. Что вы делаете. Пожалуйста, проверьте и дайте мне знать.
@lara, вместо назначения $marque = null
вы также можете назначить значение по умолчанию, отличное от нуля, в случае отсутствия соответствующего параметра.
Что ж, хотя я дал ответ в своих комментариях, я все же думаю, что мне нужно прояснить некоторые ключевые моменты кода.
Вот эти моменты.
Когда вы используете optional-parameter
(т.е. {marque?}
) в маршрутах, вам необходимо правильно сопоставить параметр с соответствующим методом контроллера (в вашем случае marque($slug)
), вот так.
function marque(?string $marque = null) { ....... ..... }
Для получения дополнительной информации проверьте ссылку на документы
https://laravel.com/docs/11.x/routing#parameters-optional-parameters
Когда вы передаете значение параметра route('catalogue.marque', ['slug' => $brand->slug])
, оно не совпадает с route-defination
. Таким образом, внутри метода marque($slug)
он не получает никаких совпадающих записей через $slug
во время выборки модели Brand
и возвращает null
. Следовательно, когда вы пытаетесь использовать paginate(12)
для полученного результата, вы получаете эту ошибку.
Call to a member function products() on null
ошибка «Вызов функции-члена продуктов() по нулевому значению» очень очевидна.
\App\Models\Brand::where('slug', $slug)->first()
возвращает NULL, и вы пытаетесь вызвать->products()
по нему