2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

laravel 検索機能の実装(スコープを使用)

Posted at

#はじめに
最近、AWSを使用してデプロイ中だが進まずに苦戦中です・・・。その為、中々投稿ができずAWSが気になってしまう日々が続いております。
Qiitaの記事が溜まってきたので気分転換にアウトプットをします。製作物に検索機能を実装したのでこちらを備忘録として投稿します。

#投稿者の環境
MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
macOS Big Sur バージョン11.0.1
PHP 7.3.23
Laravel Framework 6.20.7

#条件
今回はスコープを使います。
理由は基本的なデータベースの操作を行いたい上に、毎回同じ検索条件を書くならEloquentのクエリスコープを使った方が楽だからです。
また、検索機能で使用する時にWhere句はよく使います。このWere句ですが、条件式をモデルに定義(スコープ機能)して使いまわすことができます。今後、複雑な検索機能を実装するための基本となりますので実装してみました。

#スコープを定義する
スコープを使用するには必ず最初にscopeを名前の初めに付ける必要があります。
また、最初の変数には必ず$queryを使用します。
上記の条件を纏めると以下のような書き方になります。

sample.php
//scopeの定義 

  public function scopeNameEqual($query, $変数)
  {
    return $query->where('検索したいカラム', $変数);
  }

#モデルにスコープを使用
###ポイント1 use($serachword)
無名関数(クロージャー)を使用します。

###ポイント2 "%{$searchword}%"
ワイルドカード(今回は%を使用)を使って0文字以上の文字列を検索できるように組み込む。

Post.php
 public function scopeSearch($query, $searchword){

        return $query->where(function ($query) use($searchword) {
            $query->orWhere('name', 'like', "%{$searchword}%")
                ->orWhere('subject', 'like', "%{$searchword}%")
                ->orWhere('category', 'like', "%{$searchword}%")
                ->orWhere('message', 'like', "%{$searchword}%");
        });
    }

#コントローラーに表示させる
Request(DI)を使用してDBに保存されているデータを表示させ、searchwordをviewファイルに渡すように記述する。

PostsController.php
public function index(Request $request) {
        $searchword = $request->searchword;
        $posts = Post::orderBy('created_at', 'desc') //新しい順に表示
        ->Search($searchword)
        ->paginate(10);

        return view('bulletin-boards.index',['posts'=> $posts,'searchword' => $searchword]); //配列を使ってviewファイルに二つの変数を渡す。
    }

#検索ボックスをindexファイルに作成
検索結果を表示させるだけなのでGETにします。

index.blade.php
    <form class="form-inline" method="GET" action="{{ route('bulletin-board.index') }}">
        <input type="text" name="searchword" value="{{$searchword}}"  class="form-control mr-sm-2" placeholder="キーワードを入力">
        <button type="submit" class="search-box btn btn-info">検索</button>
    </form>
</div>

#最後に
今回の検索機能は該当する箇所を全て出現させる単純な機能になります。今後はカテゴリー毎に検索できるように挑戦してみようと思います。

#参考文献
スコープ機能について
laravel リクエストを実行する
laravel 公式
ワイルドカードとは?
補足 正規表現とワイルドカードの違い

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?