すみません…。ググったのですが見つからなかったので、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つのテーブルを共有する
ということをやっています。