我是Laravel的新手。在编写和测试我的代码时,我注意到我的destroy方法不再正常工作,我找不到我犯的错误。所以我希望你能帮助我。
我的(软件)目标是什么?我想管理“项目”。每个项目都有很多报告。所以我得到了一个包含所有已创建项目的页面,我得到了一个页面,其中列出了所有报告,其中包含“修改”和“删除”按钮。我完成了项目和报告的所有CRUD内容,当我意识到,如果我将鼠标悬停在报告或项目的删除按钮上,则会显示所选报告或项目的正确ID。如果我按下删除按钮,会弹出一个对话框并显示一条消息:“你真的要删除...”,带有“是”和“否”按钮。因此,如果我按下“是”按钮,Laravel将删除最后添加的数据库条目。
即使作为报告的项目也有自己的控制器。但两者都使用相同的_messages.php。我想,我的错误就在那个文件中。
摘自_messages.php:
@if(Session::has('sweet_alert.confirmDeleteReport'))
<div class="alert alert-warning" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<div class="row">
<div class="col-xs-12">
<strong>Achtung!</strong> {{Session::get('sweet_alert.confirmDeleteReport')}}
</div>
</div>
<div class="row">
<div class="col-md-3 col-md-offset-8">
<a class="btn btn-danger" href="{{ route('reports.destroy', $report->id) }}" title="Löschen" data-token="{{csrf_token()}}" data-method="delete">Löschen</a>
<a class="btn btn-default" data-dismiss="alert">Abbrechen</a>
</div>
</div>
</div>
@endif
摘自reportcontroller.php:
public function destroy(Report $report)
{
$report->delete();
Session::flash('sweet_alert.success','Der Bericht vom ' . $report->date . ' mit der Berichtsnummer ' . $report->reportNumber . ' wurde erfolgreich gelöscht.');
return redirect()->route('reports.index');
}
public function delete(Report $report) {
Session::flash('sweet_alert.confirmDeleteReport', 'Soll der Bericht vom ' . $report->date . ' mit der Berichtsnummer ' . $report->reportNumber . ' wirklich gelöscht werden? Dieser Vorgang kann nicht rückgängig gemacht werden.');
return redirect()->route('reports.index');
}
会话中可能有错吗?我通过执行 php artisan config:cache 来刷新缓存,但没有运气。欢迎任何想法。
问候
答案 0 :(得分:0)
如果我理解正确,您会有一个列出所有报告的页面。每个报告都有一个删除按钮,该按钮路由映射到您上面包含的delete()
方法。该方法向会话闪烁一个消息,并重新加载您的报告索引。
现在,在您的报告索引中,所有报告都会再次列出,可能在@foreach ($reports as $report)
之内。在页面底部,您有您显示的提取。这使用$report->id
,在此页面上,循环遍历所有$reports
后,只是该集合中的最后一个报告。所以它所要做的就是删除上一份报告。
我可以看到一些解决方案:
1)在delete()
方法中将您要删除的报告的ID与消息一起刷新。我不熟悉sweet_alert但是你可以刷一个数组,你的msg 和是id吗?类似的东西:
Session::flash('sweet_alert.confirmDeleteReport', [
'id' => $report->id,
'message' => 'Soll der Bericht ...'
]);
然后当然在警报中使用 id:
<a class="btn btn-danger" href="{{ route('reports.destroy', Session::get('sweet_alert.confirmDeleteReport.id')) }}" ... </a>
可能语法错误,但我假设可以闪存数组。
2)我通常做这种事情的方法是使用Javascript在单击表格中的删除按钮时填充警报/模态/其他所需的数据。例如,您的删除按钮(在主表/列表中)可能具有data-id属性:
<a href="#" data-id="{{ $report->id }}" class="btn btn-danger delete">Delete</a>
一些Javascript(伪代码,实现取决于你如何设置):
$('a.delete').on('click', function(e) {
// Prevent the default behaviour of clicking a link
e.preventDefault();
// Find the id of the report clicked
var id = $(this).data('id');
// Update the href of the alert button so it will delete *that* report
$('div.alert a.danger').attr('href', 'reports/' + id);
// ... code to display the alert/modal
});
这样可以避免页面重新加载以进入警报/模态。请注意,这会使您的delete()
方法过时,不再使用它。
<强>更新强>
如果你需要将一些变量从视图/控制器传递到外部JS文件,你可以这样做:
在视图中
<script>
var url = "{{ route('reports.destroy', Session::get('sweet_alert.confirmDeleteReport.id')) }}";
</script>
在您的外部JS (必须在上面的内联脚本之后加载)
$('div.alert a.danger').attr('href', url);