laravelの検索機能を作成したのでアウトプットしていこうと思います。
#画面
商品名:あいまい検索
商品カテゴリー:プルダウン検索
#実装
###▪️View
views/product/search.blade.php
<form class="search" enctype="multipart/form-data" action="{{route('product.index')}}" accept-charset="UTF-8" method="get">
@csrf
<div class="row">
<div class="input-group mt-4 col-md-7 offset-2">
<h2 class="mr-4">商品名</h2>
<input type="text" name="product_name" class="form-control" value="{{isset($product_name) ? $product_name : "" }}">
<span class="input-group-btn">
<input type="submit" class="btn btn-primary ml-4" value="検索">
</span>
</div>
</div>
<div class="row">
<div class="input-group mt-4 col-md-7 offset-2">
<h2>商品カテゴリ</h2>
<select id="category_id" name="category_id" class="form-control">
@foreach(config('categories') as $id => $category)
<option name="category_id" value="{{$id}}" @if ($id === $category_id_int) {{$id}} selected @endif>{{$category}}</option>
@endforeach
</select>
</div>
</div>
</form>
@foreach(config('categories') as $id => $category)
セレクトボックスの値はconfig/categories.phpに配列を持ってきています。
入力保持
・テキストボックス
value="{{isset($product_name) ? $product_name : "" }}"
・セレクトボックス
value="{{$id}}" @if ($id === $category_id_int) {{$id}} selected @endif>
なぜかold関数が使えなかったので今回の方法で入力保持しました。
これが正解かどうかはわかりませんが、参考になればと思います。
イメージとしては
値をコントローラに送って、送った値を再び表示させているイメージです。
routes/web.php
<?php
return array(
'0'=>'未選択',
'1'=>'肉類',
'2'=>'魚介類',
'3'=>'果物類',
'4'=>'野菜類',
'5'=>'飲み物類',
'6'=>'漬物類',
'7'=>'菓子類',
);
###▪️Controller
Controller/ProductsController.php
/**
* 商品検索
* @return $datas
*/
public function index(Request $request)
{
$query = Product::query();
$product_name = $request->product_name;
$category_id = $request->category_id;
//商品名の値が存在&商品名の値が空ではなかった場合
if ($request->has('product_name') && $product_name !== '') {
$query->where('product_name', 'like', '%' . $product_name . '%')->get();
}
//カテゴリーの値が存在&カテゴリーの値が0ではなかった場合
if ($request->has('category_id') && $category_id !== '0') {
$query->where('category_id', $category_id)->get();
}
$datas = $query->paginate(15);
//型変換
$category_id_int = intval($category_id);
return view('product.search', ['datas' => $datas, 'product_name' => $product_name, 'category_id_int' => $category_id_int]);
}
###▪️route
routes/web.php
Route::prefix('products')->group(function () {
Route::get('/', 'ProductsController@index')->name('product.index');
});