【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,
]);
}
参考
Author And Source
この問題について(【Laravel】複数条件の絞り込み検索機能), 我々は、より多くの情報をここで見つけました https://qiita.com/yuta_sawamura/items/691818b3de5b87432ac9著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .