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();
}
}
在列表中我显示最新的主题,包括已删除的主题。
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();
}
}