【Laravel】複数条件の絞り込み検索機能


やりたいこと

Laravelでusersテーブルに対して複数の条件で絞り込み検索機能を実装します。今回は、「名前」「性別」を検索できるようにします。

前提

  • PHP7.2
  • Laravel6.1
  • MySQL5.7

■usesテーブル

カラム コメント
sei VARCHAR
mei VARCHAR
family_name VARCHAR 性(カナ)
last_name VARCHAR 名(カナ)
sex INT 性別(1:男, 2:女)

ビュー

user/index.blade.php
<?php
 $sex = ['男' => 1, '女' => 2];
?>

<form>
  <input name="keyword" type="text" placeholder="キーワードを入力" value="{{ $params['keyword'] ?? null }}">
  <select class="form-control" name="gender">
    <option selected="selected" value="">選択してください</option>
    @foreach($sex as $key => $value)
      <option value="{{ $value }}" {{ isset($params['sex']) && $params['sex'] == $value ? 'selected': null }}>
        {{ $key }}
      </option>
    @endforeach
  <button type="submit">検索する</button>
</form>

モデル

今回はLaravelのクエリスコープを活用します。

User.php
/**
 * 絞り込み・キーワード検索
 * @param \Illuminate\Database\Eloquent\Builder
 * @param array
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeSerach(Builder $query, array $params): Builder
{
    // 性別絞り込み
    if (!empty($params['gender'])) $query->where('gender', $params['gender']);

    // キーワード検索
    if (!empty($params['keyword'])) {
        $query->where(function ($query) use ($params) {
            $query->where('sei', 'like', '%' . $params['keyword'] . '%')
                ->orWhere('mei', 'like', '%' . $params['keyword'] . '%')
                ->orWhere('family_name', 'like', '%' . $params['keyword'] . '%')
                ->orWhere('last_name', 'like', '%' . $params['keyword'] . '%');
        });
    }

    return $query;
}

コントローラ

UserController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

public function index(Request $request)
{
    $params = $request->query();

    $users = User::serach($params)->get();

    return view('admin.user.index')->with([
        'users' => $users,
        'params' => $params,
    ]);
}

参考