Итак, в основном я делаю проект для колледжа, и единственное, чего не хватает в моем проекте, - это работающая форма поиска, но я не знаю, как это сделать. Все мои продукты создаются и заносятся в базу данных.
Мои маршруты:
Route::get('/', [
'uses' => 'ProductsController@getIndex',
'as'=> 'product.index'
] //tenho de meter um . porque nao é uma diretoria global, index ta dentro
duma pasta shop
);
мой стол:
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->string("imagePath");
$table->string("title");
$table->text("description");
$table->integer("price");
});
моя структура формы:
<form action = "" method = "post" class = "navbar-form navbar-left " role = "search">
<div class = "form-group">
<input type = "text" class = "form-control" placeholder = "Search">
</div>
<button type = "submit" class = "btn btn-default">Search</button>
</form>
мой контроллер продуктов:
public function getIndex(){
$products = Products::all();
return view('shop.index', ['products' => $products]);
}
Я видел много руководств о том, как сделать один, но я не могу заставить его фильтровать те, которые у меня есть, например, если у меня есть 3 ботинка и 5 ботинок в магазине, если я напишу «ботинок» в поиске , я хочу, чтобы появлялись только 3 ботинка
да, Route::post('/', [ 'uses' => 'ProductsController@searchProducts', 'as'=>'product.search' ]);






ты можешь это сделать
html
<form action = "/search" method='post' class = "navbar-form navbar-left " role = "search">
<div class = "form-group">
<input type = "text" class = "form-control" placeholder = "Search" name = "search">
</div>
<button type = "submit" class = "btn btn-default">Search</button>
</form>
PHP
public function search(Request $request)
{
$products = Product::where('title', 'LIKE', '%'.request->search.'%')->get();
return view('search', ['products' => $products]);
}
Измените только то представление, которое вы хотите вернуть, и создайте его в файле route/web.php.
существует МНОЖЕСТВО разных способов приблизиться к чему-то вроде поиска... от простого до очень сложного, но базовым методом будет поиск в полях заголовка и описания по ключевому слову, такому как «загрузка».
Вы захотите добавить пару вещей... Во-первых, добавьте новый маршрут для обработки поискового запроса:
Route::post('/results', [
'uses' => 'ProductsController@searchProducts',
'as'=>'product.search'
]);
Затем добавьте имя в свой html-ввод, например «ключевое слово», вместе с ярлыком блейда для поля токена CSRF:
<form action = "/results" method = "post" class = "navbar-form navbar-left " role = "search">
@csrf
<div class = "form-group">
<input type = "text" class = "form-control" placeholder = "Search" name = "keyword">
</div>
<button type = "submit" class = "btn btn-default">Search</button>
</form>
Затем добавьте в контроллер функцию для обработки запроса:
public function searchProducts(Request $request){
$results = Product::where('title', 'like', '%'.$request->search.'%')
->orWhere('description', 'like', '%'.$request->search.'%')
->orderBy('title', 'desc')
->get();
return view('search_results', ['results'=>$results, 'keyword'=>$request->keyword]);
}
Наконец, создайте новый файл с именем search_results.blade.php и поместите его в каталог представлений. Это будет использоваться для отображения результатов поиска пользователю.
<h2>Search Results for {{$keyword}}</h4>
<table>
<thead>
<tr>
<th>Product</th>
<th>Description</th>
<th>Price</td>
</tr>
</thead>
<tbody>
@forelse($results as $result)
<tr>
<td>{{$result->title}}</td>
<td>{{$result->description}}</td>
<td>{{$result->price}}</td>
</tr>
@empty
<tr>
<td colspan = "3">
No Products Found
</td>
</tr>
@endforelse
</tbody>
</table>
С этой основой вы действительно можете пойти дальше и добавить параметры фильтрации, сортировки, ранжирования и многое другое. Надеюсь, это поможет вам двигаться вперед!
Прежде всего, спасибо за помощь. Во-вторых, я получаю сообщение об ошибке «419: Извините, срок действия вашего сеанса истек. Пожалуйста, обновите и повторите попытку». Любые идеи?
Ааа, извините... В Laravel встроены функции для защиты от подделки межсайтовых запросов (CSRF). Каждый раз, когда вы отправляете форму, она проверяет, был ли добавлен к запросу специальный токен... поэтому вам нужно включить это. Самый простой способ — просто добавить @csrf где-нибудь в форме. По сути, это просто ярлык блейда, который добавляет скрытый ввод формы с токеном. Никаких других изменений не требуется.
но его {{csrf_token}} или {{csrf_field}}? И я добавляю его прямо рядом с </form> ?
Laravel предлагает несколько способов сделать это, но из шаблона блейда (представления) вы можете использовать ярлык @csrf. Технически вы можете разместить его в любом месте внутри тегов формы, но я обычно добавляю его прямо вверху. Я обновил свой ответ, включив в него токен. {{csrf_field()}} тоже работает... тот же вывод, другой синтаксис.
К вашему сведению: csrf_token() даст вам только значение токена. csrf_field() предоставит вам полное поле формы с заполненным токеном.
Я поставил его в конце, прежде чем вы ответили, и, похоже, он имеет такое же применение. Теперь было то, что «Просмотр [search_results] не найден.». И я должен заменить его на «shop.index» или «/», чтобы перейти на главную страницу, но с перечисленными товарами. Но если я это сделаю, это выдаст мне ошибку файла, который я даже не трогал для этой проблемы.
В моем примере вам нужно создать новый файл представления с именем search_results.blade.php для отображения результатов. Вы также можете повторно использовать одно и то же представление, добавив проверку, чтобы увидеть, установлена ли переменная $results и условно отображать раздел результатов. Множество различных опций в зависимости от того, как вы хотите, чтобы поиск работал.
ваш HTML будет
<form action = "{{ route('product.search') }}" method = "post" class = "navbar-form navbar-left " role = "search">
@csrf
<div class = "form-group">
<input type = "text" class = "form-control" name = "search" placeholder = "Search">
</div>
<button type = "submit" class = "btn btn-default">Search</button>
</form>
в вашей функции searchProduct
для подобного запроса, где он может выполнять поиск по заголовку, и если присутствует ключевое слово, он вернет все продукты с таким же заголовком, который вы ищете
public function searchProducts(Request $request){
$products = Product::where('title', 'like', '%'.$request->search.'%')->get();
return view('shop.index', ['products' => $products]);
}
для точно такого же результата заголовка
public function searchProducts(Request $request){
$products = Product::where('title',$request->search)->get();
return view('shop.index', ['products' => $products]);
}
это не дает мне никаких ошибок, но показывает страницу shop.index с любыми фильтрами того, что я помещал в поле поиска. Все мои продукты по-прежнему отображаются
у вас есть ботинки в поле названия всего продукта?
Это не сработало, потому что у меня есть 2 имени в моей форме (имя = «поиск» и имя = «ключевое слово»)
Вы создали маршрут поиска