How to always use withTrashed() for model Binding

不想你离开。 提交于 2019-12-11 03:49:15

问题


In my app, I use soft delete on a lot of object, but I still want to access them in my app, just showing a special message that this item has been deleted and give the opportunity to restore it.

Currently I have to do this for all my route parametters in my 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);
        });

        [...]


    }

Is there a quicker and better way to add the trashed Object to the model binding ?


回答1:


Jerodev's answer didn't work for me. The SoftDeletingScope continued to filter out the deleted items. So I just overrode that scope and the SoftDeletes trait:

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:

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

This effectively just removes the filter while still allowing me to use all the rest of the SoftDeletingScope extensions.

Then in my model I replaced the SoftDeletes trait with my new SoftDeletesWithDeleted trait:

use App\Models\Traits\SoftDeletesWithDeleted;

class MyModel extends Model
{
    use SoftDeletesWithDeleted;



回答2:


You can add a Global Scope to the models that have to be visible even when trashed.

For example:

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

Update:
If you don't want to show the deleted objects you can still manually add ->whereNull('deleted_at') to your query.



来源:https://stackoverflow.com/questions/47749901/how-to-always-use-withtrashed-for-model-binding

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!