【Laravel】ローカルスコープを使って検索機能実装
PHPバージョン:7.1.14
Laravelバージョン:5.7.9
LaravelのEloquentにはスコープという機能があります!
スコープを使えば、DBのレコードから特定の条件で検索をかけることができます!
またスコープをチェーンしていくことで検索条件をスッキリと記述することができます!
スコープにはローカルスコープとグローバルスコープとありますが、
今回はローカルスコープについてです!
ローカルスコープをモデルに記述
ローカルスコープは、モデル内にスコープを書いていきます。
Articleモデルに
・タイトルのあいまい検索
・カテゴリーの検索
・いいね数が指定した値以上かの検索
・いいね数が指定した値以下かの検索
を作成していきます。
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $guarded = ['id']; public function scopeFuzzyTitle($query, $str) { return $query->where('title', 'like', "%{$str}%"); } public function scopeEqualCategory($query, $str) { return $query->where('category', $str); } public function scopeGreaterThanGood($query, $int) { return $query->where('good', '>=', $int); } public function scopeLessThanGood($query, $int) { return $query->where('good', '<=', $int); } }
app>Models>Articles.php
スコープ内で行なっていることは
whereを使った検索です。
スコープの名前には必ず"scope"と付けます。
第二引数の値が検索時に使う値となります。
コントローラーからローカルスコープ検索の実行
続いてコントローラーから
ローカルスコープを使った検索を行なっていきます。
(ResourceControllerを利用します。)
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Article; class ResController extends Controller { public function index() { $articles = Article::all(); return view('res.index', ['articles'=>$articles]); } public function search(Request $request) { $articles = Article::equalCategory($request->category)->greaterThanGood($request->good)->get(); return view('res.index', ['articles'=>$articles]); } }
app>Http>Controllers>ResController.php
indexメソッドはただArticleモデルを全件表示しているだけです。
searchメソッドでローカルスコープを使った検索を行なっています。
Articleの"equalCategory"を呼び出すことで、
ローカルスコープ"scopeEqualCategory"を使うことができます。
呼び出し時には先頭の"scope"は省略可能です。
また第一引数の$queryも省略可能です。
第二引数に渡す検索条件の値のみを記述します。
あらかじめ用意しておいたローカルスコープをチェーンしていくことで、
複雑な検索を実現します。
今回でいうと
・カテゴリーが一致している。
・いいね数が5以上である。
という検索条件です。
チェーンしていけば更に複雑な検索条件を実現できます。
結果
mysql> select id, title, body, category, good from articles; +----+--------------------------------------+-----------------------------------------------------------------+----------+------+ | id | title | body | category | good | +----+--------------------------------------+-----------------------------------------------------------------+----------+------+ | 1 | 【Unity】GetComponentの使い方 | 今回は GetComponentの使い方についてです! | Unity | 20 | | 2 | 【Laravel】 Controllerの使い方 | 今回はコントローラーの使い方についてです! | Laravel | 15 | | 3 | 【日記】8月1日 | きょうはなんにもないすばらしい一日だった | 日記 | 12 | | 4 | 【日記】8月2日 | きょうはなんにもないすばらしい一日だった | 日記 | 5 | | 5 | 【日記】8月3日 | きょうはなんにもないすばらしい一日だった | 日記 | 0 | +----+--------------------------------------+-----------------------------------------------------------------+----------+------+ 5 rows in set (0.00 sec)
このようなデータを用意し、
カテゴリー:日記
いいね数:5以上
という条件で検索します。
http:// localhost:8000/articles/search?category=日記&good=5
検索によりid=4, 5 の2記事が表示されました!
今回はここまでです、ありがとうございました〜!