0
1

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 5 years have passed since last update.

Herokuにlaravelで作成したアプリケーションをあげてみる 20181018

Last updated at Posted at 2018-10-18

検索とスコープ

nameで検索できるようにするためPersonController.phpのsearchメソッドを書き換える。

PersonController.php
public function search(Request $request)
{
    $item = Person::where('name', $request->input)->first();
    $param = ['input' => $request->input, 'item' => $item];
    return view('person.find', $param);
}

修正して起動してみると下記の画像の様にnameで検索できる。

スクリーンショット 2018-10-18 22.38.25.png

ちなみに

PersonController.php
$item = Person::where('name', $request->input)->first();

上記のコードでnameの値を検索している。
nameの値が$request->inputと同じ条件を設定している。そしてfirst()で最初のレコードを取得している。

スコープを利用する

ローカルスコープをよう知るためPersonモデルクラスにメソッドを追加する。

Person.php
public function scopeNameEqual($query, $str)
{
    return $query->where('name', $str);
}

$strの値をwhereして実行した結果をreturnしている。

PersonController.phpのsearchメソッドを書き換える。

PersonController.php
public function search(Request $request)
{
    $item = Person::nameEqual($request->input)->first();
    $param = ['input' => $request->input, 'item' => $item];
    return view('person.find', $param);
}

nameEqualを呼び出せば、nameが指定した名前に絞り込んでレコードを抽出できる。
first()がついているので抽出レコードの一番初めを選択している。
結果は先ほどと同じで名前を検索することができる。

スコープを組み合わせる

指定した範囲内にあるレコードを検索できる様にしてみる。

Personモデルクラスにメソッドを追加する。

Person.php
public function scopeAgeGreaterThan($query, $n)
{
    return $query->where('age', '>=', $n);
}

public function scopeAgeLessThan($query, $n)
{
    return $query->where('age', '<=', $n);
}

scopeAgeGreaterThanは、ageの値が引数の値と等しいもしくは大きいものを絞り込む。
scopeAgeLessThanは、ageの値が引数の値と等しいもしくは小さいものを絞り込む。

PersonController.phpのsearchメソッドを書き換える。

PersonController.php
public function search(Request $request)
{
    $min = (int)$request->input * 1;
    $max = $min + 10;
    $item = Person::ageGreaterThan($min)->ageLessThan($max)->first();
    $param = ['input' => $request->input, 'item' => $item];
    return view('person.find', $param);
}

 画像の様に入力した数値〜+10の範囲で検索できる。
ちなみに(int)$reuqest->inputをしてる理由は、途中で警告が出たため。

スクリーンショット 2018-10-18 23.32.03.png

グローバルスコープを作成してみる

そのモデルでの全てのレコード取得にそのスコープが適用されることをグローバルスコープという。

Person.phpにメソッドを追加する。

Person.php
use Illuminate\Database\Eloquent\Builder;

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('age', function (Builder $builder) {
        $builder->where('age', '>', 20);
    });
}

/personにアクセスすると20歳以上のレコードが表示される。

スクリーンショット 2018-10-18 23.53.26.png

#ScopePersonクラスを作る

app/内に「Scopes」とい名前のディレクトリを作成する。
その中に「ScopePerson.php」というファイルを作成する。

ScopePerson.php
<?php
namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ScopePerson implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('age', '>', '20');
    }
}

Personクラスのbootメソッドを修正する。

Person.php
protected static function boot()
{
    parent::boot();

    static::addGlobalScope(new ScopePerson);
}

先ほどと同様に20歳以上のレコード選択できていればOK

次回はモデルの保存と更新と削除をやっていこう。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?