LoginSignup
9
9

More than 5 years have passed since last update.

Laravel5のEloquentで常に固定条件で自動的にWhereしたい!

Last updated at Posted at 2017-02-26

すみません…。ググったのですが見つからなかったので、SEO的なキーワードを盛り込んだタイトルにさせていただきました……。元の記事は下記、Laravel4で、Laravel5の記事が見つからなかったのでその補足です。

何がしたい?

元記事にあるように、deleted というフラグをONにしたレコードは永遠に見たくない場合。(「Laravelにソフトデリート機能あるよ」という声は今回は無視します(・∀・)

MyModel::where('deleted',0)->get();
MyModel::where('deleted',0)->where('created_at','>','2017-01-16 16:00')->first();

このように、ありとあらゆるところに where('deleted',0) と入れる必要があり、煩雑になるし、なにより忘れそうです。これをシンプルに、

MyModel::get();
MyModel::where('created_at','>','2017-01-16 16:00')->first();

としたい、という案件です。

Model::newQuery をオーバーライドする

ModelのnewQueryをオーバーライドするとできます。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MySoftDeleteModel extends Model
{
    public function newQuery($excludeDeleted = true)
    {
        // 親のメソッドを呼び出す。
        // もともとはクエリビルダーを新規作成するときに呼び出されるメソッドです。
        $query = parent::newQuery($excludeDeleted);

        // すべてのクエリに deleted = 0 の条件を最初に指定します。
        $query = $query->where('deleted',0);

        return $query;
    }
}

応用編

こんな機能を利用して
Laravel5 Eloquentの複数モデルで1つのテーブルを共有する
ということをやっています。

9
9
2

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
9
9