如何始终使用withTrashed()进行模型绑定

时间:2017-12-11 09:36:47

标签: laravel eloquent laravel-5.5

在我的应用程序中,我在很多对象上使用了软删除,但我仍然希望在我的应用程序中访问它们,只显示一条特殊消息,表明该项目已被删除,并提供恢复它的机会。

目前我必须为我的RouteServiceProvider中的所有路径参数执行此操作:

    /**
     * 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);
        });

        [...]


    }

是否有更快更好的方法将已删除的对象添加到模型绑定中?

2 个答案:

答案 0 :(得分:2)

杰罗德夫的回答对我不起作用。 Spring Batch Job继续过滤掉已删除的项目。所以我只是覆盖了那个范围和SoftDeletingScope特征:

<强> SoftDeletingWithDeletesScope.php:

SoftDeletes

<强> SoftDeletesWithDeleted.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)
    {
    }
}

这实际上只是删除了过滤器,同时仍允许我使用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); } } 个所有扩展名。

然后在我的模型中,我将SoftDeletingScope特征替换为我的新SoftDeletes特征:

SoftDeletesWithDeleted

答案 1 :(得分:0)

您可以向模型添加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')添加到查询中。