我创建了一个轮询系统,在后端(CMS区域)我希望管理员能够删除民意调查。当管理员删除轮询时,它应该软删除轮询。这是按预期工作的,但我也希望管理员能够恢复民意调查。为此,我将在管理区域中显示所有民意调查(包括软删除的民意调查)。
PollController index()获取所有民意调查
$polls = Poll::withTrashed()->get();
在刀片中,我希望每次轮询都有两个不同的按钮。其中一个还原,一个用于删除,但我只想为每个轮询显示1个按钮,具体取决于是否可以恢复或删除。
要做到这一点,我把它放在刀片的foreach中:
@if($poll->trashed())
// Restore button
@else
// Delete button
@endif
然而问题是,当我所拥有的3个民意调查中只有1个被软删除时,trashed()会继续为所有民意调查返回true。我不确定为什么trashed()返回所有这些都是真的?
我如何才能使此方法正常工作?感谢。
答案 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);