laravel에서 검색 기능 구현

7607 단어 MySQLPHPLaravel
이번에는 부분 일치 검색을 위한 입력 문자열을 실시하고 드롭다운 메뉴에서 검색 기능을 선택합니다.구체적으로 말하면 아래 화면에서 사용자 이름, 기력, 좋아하는 전법에 따라 검색한다.

사용자 모델은name(사용자 이름),stength(기력),tactics(좋아하는 전술)라는 열을 정의합니다.

class User extends Authenticatable
{
    protected $fillable = [
        'name','strength','tactics',
    ];
}
컨트롤러는 다음과 같은 index 방법을 정의합니다.
class SearchController extends Controller
{
    public function index(Request $request){
        $query = User::query();

     //$request->input()で検索時に入力した項目を取得します。
        $search1 = $request->input('strength');
        $search2 = $request->input('tactics');
        $search3 = $request->input('name');

         // プルダウンメニューで指定なし以外を選択した場合、$query->whereで選択した棋力と一致するカラムを取得します
        if ($request->has('strength') && $search1 != ('指定なし')) {
            $query->where('strength', $search1)->get();
        }

         // プルダウンメニューで指定なし以外を選択した場合、$query->whereで選択した好きな戦法と一致するカラムを取得します
        if ($request->has('tactics') && $search2 != ('指定なし')) {
            $query->where('tactics', $search2)->get();
        }

        // ユーザ名入力フォームで入力した文字列を含むカラムを取得します
        if ($request->has('name') && $search3 != '') {
            $query->where('name', 'like', '%'.$search3.'%')->get();
        }

    //ユーザを1ページにつき10件ずつ表示させます
        $data = $query->paginate(10);

        return view('users.search',[
            'data' => $data
        ]);
    }
}
검색 버튼을 누를 때의 라우팅은 다음과 같습니다.
//検索ボタンを押すとコントローラのindexメソッドを実行します
Route::get('Search','SearchController@index')->name('search');
사용자 검색 페이지의 보기는 다음과 같습니다.
    <div class="row">
        <div class="col-sm-4">
            <div class="text-center my-4">
                <h3 class="brown border p-2">ユーザ検索</h3>
            </div>
            {!! Form::open(['route' => 'search', 'method' => 'get']) !!}
                <div class="form-group">
                    {!! Form::label('text', 'ユーザ名:') !!}
                    {!! Form::text('name' ,'', ['class' => 'form-control', 'placeholder' => '指定なし'] ) !!}
                </div>
                <div class="form-group">
                    {!! Form::label('strength', '棋力:') !!}
                    {!! Form::select('strength', ['指定なし' => '指定なし'] + Config::get('strength.kiryoku') ,'指定なし') !!}
                </div>
                <div class="form-group">
                    {!! Form::label('tactics', '好きな戦法:') !!}
                    {!! Form::select('tactics', ['指定なし' => '指定なし'] + Config::get('tactics.senpou') , '指定なし') !!}
                </div>
                {!! Form::submit('検索', ['class' => 'btn btn-primary btn-block']) !!}
            {!! Form::close() !!}
        </div>
        <div class="col-sm-8">
            <div class="text-center my-4">
                <h3 class="brown p-2">ユーザ一覧</h3>
            </div>

            <div class="container">
                <!--検索ボタンが押された時に表示されます-->
                @if(!empty($data))
                    <div class="my-2 p-0">
                        <div class="row  border-bottom text-center">
                            <div class="col-sm-4">
                                <p>ユーザ名</p>
                            </div>
                            <div class="col-sm-4">
                                <p>棋力</p>
                            </div>
                            <div class="col-sm-4">
                                <p>好きな戦法</p>
                            </div>
                        </div>
              //検索条件に一致したユーザを表示します
                        @foreach($data as $item)
                                <div class="row py-2 border-bottom text-center">
                                    <div class="col-sm-4">
                                        <a href="">{{ $item->name }}</a>
                                    </div>
                                    <div class="col-sm-4">
                                        {{ $item->strength }}
                                    </div>
                                    <div class="col-sm-4">
                                        {{ $item->tactics }}
                                    </div>
                                </div>
                        @endforeach
                    </div>
                    {{ $data->appends(request()->input())->render('pagination::bootstrap-4') }}
                @endif
            </div>
        </div>
    </div>

여기, 아래와 같이 미리strength를 보여 줍니다.php를 만들고 "kiryoku"라는 그룹을 정의합니다.위 보기에서 config::get ("strength.kiryoku") 에서 이 그룹을 검색하고 밑에 있는 메뉴를 만듭니다.이 밖에 ['指定なし' => '指定なし'] + config::get('strength.kiryoku')kiryoku 그룹에'무지정'이라는 요소를 추가했다.
config/strength.php

<?php 
return array(
    'kiryoku' => array(
  '10級' => '10級', 
  '9級' => '9級', 
  '8級' => '8級', 
  '7級' => '7級',
  '6級' => '6級', 
  '5級' => '5級', 
  '4級' => '4級', 
  '3級' => '3級',
  '2級' => '2級', 
  '1級' => '1級', 
  '初段' => '初段', 
  '二段' => '二段',
  '三段' => '三段', 
  '四段' => '四段', 
  '五段' => '五段', 
  '六段' => '六段',
  ),
);
?>
config:get('tactics.senpou')도 마찬가지입니다.
config/tactics.php
<?php 
return array(
    'senpou' => array(
  '角換わり' => '角換わり', 
  '矢倉' => '矢倉', 
  '相掛かり' => '相掛かり', 
  '横歩取り' => '横歩取り',
  '向かい飛車' => '向かい飛車', 
  '三間飛車' => '三間飛車', 
  '四間飛車' => '四間飛車', 
  '中飛車' => '中飛車'
  ),
);
?>
사용자 이름만 사용하여 검색할 때 다음과 같이 올바르게 표시됩니다.

또 기력, 좋아하는 전법으로 검색한 경우에도 다음과 같은 내용이 정확하게 드러났다.

이번 검색 기능의 요점은 컨트롤러의 $request->input 방법과 $query->where 방법이라고 생각합니다.또한 밑에 있는 메뉴의 구현은 config 파일을 사용했지만 의외로 실패했습니다.밑에 있는 메뉴는 다른 방법으로 더욱 간단하게 실현할 수 있을 것이다.

좋은 웹페이지 즐겨찾기