LoginSignup
2
1

More than 1 year has passed since last update.

【Laravel】モデルのスコープの使い方

Posted at

DBの値を検索する際、モデルにスコープを指定するメソッドを定義し、そのメソッドを呼び出すことで条件を絞り込むことができます。

ローカルスコープ

モデルにスコープを指定するメソッドを指定します。
※メソッドの名前はscope + 大文字で始まる名前(scopeUserなど)

app/Models/Memo.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

class Memo extends Model
{
    // ユーザーを指定
    public function scopeUser($query)
    {
        // 認証済みユーザー
        return $query->where('user_id', Auth::id());
    }

    // 有効な(論理削除されていない)ものを指定
    public function scopeActive($query)
    {
        return $query->whereNull('deleted_at');
    }
}

呼び出す時のメソッド名はscopeなしの小文字です(user()など)

app/Http/Controllers/HomeController.php
    public function index()
    {
        $memos = Memo::user()->active()->orderBy('updated_at', 'desc')->get();
        return view('create', compact('memos'));
    }

モデルに定義したメソッドを組み合わせることで、柔軟にスコープを組み合わせることができます。

グローバルスコープ

そのモデルでの全ての検索にそのスコープが適用されます。

app/Models/Memo.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder; //追加
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

class Memo extends Model
{
    // モデルの初期起動メソッドでスコープを指定
    protected static function booted()
    {
        static::addGlobalScope('user_id', function (Builder $builder) {
            // 認証済みユーザー
            $builder->where('user_id', Auth::id());
        });
    }

    // 有効な(論理削除されていない)ものを指定
    public function scopeActive($query)
    {
        return $query->whereNull('deleted_at');
    }
}
app/Http/Controllers/HomeController.php
public function index()
    {
        $memos = Memo::active()->orderBy('updated_at', 'desc')->get();
        return view('create', compact('memos'));
    }

検索結果はローカルスコープを使用した場合と同じです。

参考

良かったら^^

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