Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【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 | 【日記】81日                       | きょうはなんにもないすばらしい一日だった                        | 日記     |   12 |
|  4 | 【日記】82日                       | きょうはなんにもないすばらしい一日だった                        | 日記     |    5 |
|  5 | 【日記】83日                       | きょうはなんにもないすばらしい一日だった                        | 日記     |    0 |
+----+--------------------------------------+-----------------------------------------------------------------+----------+------+
5 rows in set (0.00 sec)

このようなデータを用意し、

カテゴリー:日記
いいね数:5以上
という条件で検索します。

http:// localhost:8000/articles/search?category=日記&good=5

f:id:hiyotama:20181116175113p:plain

検索によりid=4, 5 の2記事が表示されました!


今回はここまでです、ありがとうございました〜!