Laravelで絞り込み検索をする


やりたいことは

  • フォームに入力されたデータを取得して、一致するデータのみをリスト表示

ビュー

<form action="/search" method="get">
    <input type="text" name="name" placeholder="社名・社員名を入力ください">
    <button type="submit" value="検索">検索</button>
</form>


<table class="staffs">
    <thead>
        <tr>
            <th>会社名</th>
            <th>氏名</th>
            <th>ふりがな</th>
        </tr>
    </thead>
    <tbody>
        @forelse ($testData as $staff)
            <tr>
                <td>{{$staff["company"]}}</td>
                <td>{{$staff["name"]}}</td>
                <td>{{$staff["kana"]}}</td>
            </tr>
        @empty
            <tr>
                <td>データがありません</td>
                <td>データがありません</td>
                <td>データがありません</td>
            </tr>
        @endforelse
    </tbody>
</table>

コントローラー

unsetを使う

指定した変数の割当を解除する関数。
これを使って条件にあてはまらない配列だけ解除。
検索ボタンを押すと下記のメソッドが実行されるようにすればOK。

Route::get('/search', function(Request $request){
    $testData = [];
    $testData[] = [
        "company" => "株式会社クエスチョン",
        "name" => "鈴木たけし",
        "kana" => "すずきたけし"
    ];
    $testData[] = [
        "company" => "株式会社hatenabox",
        "name" => "山田太郎",
        "kana" => "やまだたろう"
    ];
    $testData[] = [
        "company" => "チャット(株)",
        "name" => "田中一郎",
        "kana" => "たなかいちろう"
    ];

    $this->request = $request;
    $formData = $this->request->get("name");

//    テストデータの各グループについてフィルタリング
    if($formData){
        foreach($testData as $index=>$test) {
            if ($test["name"] !== $formData && $test["company"] !== $formData && $test["kana"] !== $formData) {
                unset($testData[$index]);
            }
        }
    }

    return view('memberlist', [
        "testData" => $testData
    ]);
});

結果

  • フォームにデータがあれば当てはまる配列だけ残って表示される
  • フォームにデータがなければフィルタリングされないので全ての配列が表示される

補足

  1. あんまりif文は使わずにforeachで
  2. できるだけまとまりで渡して行って、最後はシンプルな配列をビューに渡す

といい感じになるらしい。