如何在刀片中显示哪些行被软删除?

时间:2018-06-08 10:05:57

标签: laravel laravel-5 eloquent

我创建了一个轮询系统,在后端(CMS区域)我希望管理员能够删除民意调查。当管理员删除轮询时,它应该软删除轮询。这是按预期工作的,但我也希望管理员能够恢复民意调查。为此,我将在管理区域中显示所有民意调查(包括软删除的民意调查)。

PollController index()获取所有民意调查

$polls = Poll::withTrashed()->get();

在刀片中,我希望每次轮询都有两个不同的按钮。其中一个还原,一个用于删除,但我只想为每个轮询显示1个按钮,具体取决于是否可以恢复或删除。

要做到这一点,我把它放在刀片的foreach中:

@if($poll->trashed())
// Restore button
@else
// Delete button
@endif

然而问题是,当我所拥有的3个民意调查中只有1个被软删除时,trashed()会继续为所有民意调查返回true。我不确定为什么trashed()返回所有这些都是真的?

我如何才能使此方法正常工作?感谢。

1 个答案:

答案 0 :(得分:2)

第1部分 这取决于您的查询。使用软删除时,Laravel将查询默认情况下未软删除的所有模型。如果您还想获得软删除模型,则需要在查询中调用withTrashed()方法。在这里阅读更多: https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

要了解withTrashed()的作用,您需要了解软删除的工作原理。软删除模型的工作原理是在数据库表中添加一个名为deleted_at的新列。它的值默认为null。当您软删除模型时,Laravel会将当前时间戳放入该列。因此,该字段不再包含空值。

在使用soft-deletes时查询模型时,Laravel会在查询中附加一个deleted_at为null的条件。调用withTrashed()方法,从查询中删除该条件。

查看默认查询修饰符和withTrashed方法的来源。

第2部分 这是事件。您可以调用它来告诉Laravel,它应该在发生此事件时执行特定的闭包。在您的示例中,它正在侦听"删除"事件。点击此处了解更多信息: https://laravel.com/docs/5.5/eloquent#events

第3部分 您可以使用delete soft-deletable方法完全forceDelete()个模型。请参阅"永久删除模型"这里: https://laravel.com/docs/5.5/eloquent#querying-soft-deleted-models

例如 $items = App\Model::withTrashed()->get();

如果要恢复单个项目,只需按ID查找: $item = App\Model::find($id);