Laravel/Livewire:在模型路由绑定上使用 withTrashed() 以显示已删除的记录

Laravel/Livewire: Use withTrashed() on model route binding on to show deleted records

在列表中我显示最新的主题,包括已删除的主题。

function latest()
{
    return Topic::withTrashed()->latest();
}

为了显示单个主题,我有一个 Livewire 组件,其中传递了该主题。

class ShowTopic extends Component
{
    public $topic;

    public function mount(Topic $topic)
    {
        $this->topic = $topic;
    }

    public function render()
    {
        return view('livewire.show-topic', [
            'topic' => $this->topic,
        ]);
    }
}

但是当我转到一个被删除的主题时,它没有显示。我如何在模型路由绑定上使用 withTrashed() 来显示已删除的记录与我的 Livewire 组件?

您可以覆盖 Eloquent 模型上的 resolveRouteBinding() 方法,并有条件地删除 SoftDeletingScope 全局范围。

我在这里使用该模型的策略来检查我是否可以 delete 该模型 - 如果用户可以删除它,他们也可以看到它。您可以实现任何您想要的逻辑,或者如果更适合您的应用程序,则删除所有请求的全局范围。

use Illuminate\Database\Eloquent\SoftDeletingScope;

class Topic extends Model {
    // ...

    /**
    * Retrieve the model for a bound value.
    *
    * @param  mixed  $value
    * @param  string|null  $field
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function resolveRouteBinding($value, $field = null)
    {
        // If no field was given, use the primary key
        if ($field === null) {
            $field = $this->getKey();
        }

        // Apply where clause
        $query = $this->where($field, $value);

        // Conditionally remove the softdelete scope to allow seeing soft-deleted records
        if (Auth::check() && Auth::user()->can('delete', $this)) {
            $query->withoutGlobalScope(SoftDeletingScope::class);
        }

        // Find the first record, or abort
        return $query->firstOrFail();
    }
}