2017-12-11 37 views
1

私のアプリでは、多くのオブジェクトに対してソフト削除を使用しますが、私のアプリではまだアクセスしたいと思っています。それを復元する機会を与えてください。モデルバインディングに常にwithTrashed()を使用する方法

現在、私は私のRouteServiceProvider内のすべての私のルートparamettersのためにこれをしなければならない。

/** 
    * Define your route model bindings, pattern filters, etc. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 


     parent::boot(); 

     Route::bind('user', function ($value) { 
      return User::withTrashed()->find($value); 
     }); 

     Route::bind('post', function ($value) { 
      return Post::withTrashed()->find($value); 
     }); 

     [...] 


    } 

結合モデルにゴミ箱オブジェクトを追加するための迅速かつより良い方法はありますか?

答えて

1

ゴミ箱にしても表示されるモデルにGlobal Scopeを追加できます。例えば

class WithTrashedScope implements Scope 
{ 
    public function apply(Builder $builder, Model $model) 
    { 
     $builder->withTrashed(); 
    } 
} 

class User extends Model 
{ 
    protected static function boot() 
    { 
     parent::boot(); 

     static::addGlobalScope(new WithTrashedScope); 
    } 
} 

更新:
あなたはまだ手動でクエリに->whereNull('deleted_at')を追加することができます削除されたオブジェクトを表示したくない場合は

+0

それはソフトが無関係削除するだろう、私はちょうどsoftDelete形質を削除することもできますが、その後、私のソフト削除されたオブジェクトは、常にだろうショーン たとえば、すべてのアクティブなユーザーの一覧を表示するか、またはそれらにオートコンプリートを実行して、ソフト削除が表示されないようにしたいとします。 私はそれらをモデルバインディングでのみ要求しているので、私は彼らに要求を行うときに404を取得しません –

+0

私はそれがポイントだと思った – Jerodev

+0

あなたの問題のアップデートを追加しました – Jerodev

0

私はJerodevの答えがうまくいかなかった。 SoftDeletingScopeは削除されたアイテムを引き続きフィルタリングしました。まだ可能にしながら

namespace App\Models\Traits; 

use Illuminate\Database\Eloquent\SoftDeletes; 
use App\Models\Scopes\SoftDeletingWithDeletesScope; 

trait SoftDeletesWithDeleted 
{ 
    use SoftDeletes; 

    public static function bootSoftDeletes() 
    { 
     static::addGlobalScope(new SoftDeletingWithDeletesScope); 
    } 
} 

これは事実だけで、フィルタを削除します。

SoftDeletingWithDeletesScope.php:

namespace App\Models\Scopes; 

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

class SoftDeletingWithDeletesScope extends SoftDeletingScope 
{ 
    public function apply(Builder $builder, Model $model) 
    { 
    } 
} 

SoftDeletesWithDeleted.phpだから、僕はそのスコープとSoftDeletes形質をオーバーライド私はSoftDeletingScope拡張の残りの部分をすべて使用しています。

はその後、私のモデルでは、私は私の新しいSoftDeletesWithDeleted形質にSoftDeletes形質を置き換える:

use App\Models\Traits\SoftDeletesWithDeleted; 

class MyModel extends Model 
{ 
    use SoftDeletesWithDeleted; 
関連する問題