在我的应用程序中,我在很多对象上使用了软删除,但我仍然希望在我的应用程序中访问它们,只显示一条特殊消息,表明该项目已被删除,并提供恢复它的机会。
目前我必须为我的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);
});
[...]
}
是否有更快更好的方法将已删除的对象添加到模型绑定中?
答案 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')
添加到查询中。