LoginSignup
0
3

More than 3 years have passed since last update.

【Laravel】グローバルスコープを用いてコード量を減らす

Last updated at Posted at 2020-06-27

はじめに

実装していてモデルのクエリに制約で何度も同じ実装することはありませんか。
そんな時はグローバルスコープというLaravelの機能のグローバルスコープを使って1回の実装で済むようにするのも1つの方法かなと思います。

グローバルスコープとは

グローバルスコープにより、指定したモデルの全クエリに対して、制約を付け加えることができます。Laravel自身のソフトデリート機能は、「削除されていない」モデルをデータベースから取得するためにグローバルスコープを使用しています。独自のグローバルスコープを書くことにより、特定のモデルのクエリに制約を確実に、簡単に、便利に指定できます。

引用:Eloquent:利用の開始 7.x Laravel

グローバルスコープを1回の実装すれば特定のモデルのクエリに制約ができ、かなり便利です。

グローバルスコープの実装

Illuminate\Database\Eloquent\Scope配下に適当なファイルを作成します。

walkingMinutes.php
<?php

namespace App\Scopes;

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

class walkingMinutesScope implements Scope
{
    /**
     * Eloquentクエリビルダへ適用するスコープ
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function setGlobalScope(Builder $builder, Model $model)
    {
        static::addGlobalScope('walking_minute', function (Builder $builder) {
            $builder->orderByRaw('walking_minute' ASC NULLS LAST);
        });
    }
}

こんな感じに実装するとどこでもwalking_minutes(徒歩時間)が短い順に表示できるようになります。

おわりに

いかがでしたでしょうか。
うまく実装して無駄な実装を減らしていきましょう。

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