はじめに
実装していてモデルのクエリに制約で何度も同じ実装することはありませんか。
そんな時はグローバルスコープというLaravelの機能のグローバルスコープを使って1回の実装で済むようにするのも1つの方法かなと思います。
グローバルスコープとは
グローバルスコープにより、指定したモデルの全クエリに対して、制約を付け加えることができます。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(徒歩時間)が短い順に表示できるようになります。
おわりに
いかがでしたでしょうか。
うまく実装して無駄な実装を減らしていきましょう。