laravel destroy只删除最后添加的内容

时间:2017-09-13 14:38:47

标签: php mysql laravel

我是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">&times;</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 来刷新缓存,但没有运气。欢迎任何想法。

问候

1 个答案:

答案 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);