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'));
}
検索結果はローカルスコープを使用した場合と同じです。
参考
良かったら^^