Php 如何通过ajax删除laravel中的记录

Php 如何通过ajax删除laravel中的记录,php,ajax,laravel,Php,Ajax,Laravel,我知道在这个问题上也有类似的问题,但我已经在那些答案正确的问题之后尝试了我的副本,但仍然无济于事。 我不断地发现这个错误: BadMethodCallException方法删除不存在。在Macroable.php中(第74行) 为了快速,这是我的控制器: public function destroy(Subject $subject) { // $response = array(); $modal = new Subject; $modal = Subje

我知道在这个问题上也有类似的问题,但我已经在那些答案正确的问题之后尝试了我的副本,但仍然无济于事。 我不断地发现这个错误:

BadMethodCallException方法删除不存在。在Macroable.php中(第74行)

为了快速,这是我的控制器:

public function destroy(Subject $subject)
{
    //
    $response = array();

    $modal = new Subject; 
    $modal = Subject::find($subject);

    if ( $modal->delete() ) {
        $response['success'] = '<b>'.$modal->name.'</b>'.' successfully deleted';
        $response['subject'] = $modal;   
    }

    return \Response::json($response);

}
以下是我的看法:

<td>
    <a data-token="{{ csrf_token() }}" id="delete" data-id="{{$subject->id}}" data-toggle="tooltip" title="Edit" href="/subjects/{{$subject->id}}" role="button"><i class="glyphicon glyphicon-trash text-danger"></i></a>
</td>

最后,我的脚本:

$(document).on('click', '#delete', function(event) {
            event.preventDefault();
            /* Act on the event */

            // id of the row to be deleted
            var id = $(this).attr('data-id');

            var token = $(this).data("token");

            console.log(id);

            // row to be deleted
            var row = $(this).parent("td").parent("tr");

            var message = "subject";

             bootbox.dialog({
                message: "Are you sure you want to Delete this "+message+"?",
                title: "<i class='glyphicon glyphicon-trash'></i> Delete !",
                buttons: {
                    success: {
                        label: "No",
                        className: "btn-success",
                        callback: function() {
                            $('.bootbox').modal('hide');
                        }
                    },
                    danger: {
                        label: "Delete!",
                        className: "btn-danger",
                        callback: function() {

                            $.ajaxSetup({
                                headers: {
                                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                                }
                            });

                            $.ajax({
                                type: 'DELETE',
                                url: '/subjects/delete/'+id,
                                data: {
                                    "id": id,
                                    "_method": 'DELETE',
                                    "_token": token
                                }
                            })
                           .done(function(response){
                                bootbox.alert(response.success);
                                //removing the row that have been deleted
                                jQuery(row).fadeOut('slow');
                            })
                           .fail(function(){
                                bootbox.alert('Something Went Wrong .... Please contact administrator');
                            })
                        }
                    }
                }
            });
        });
$(文档)。在('click','#delete',函数(事件){
event.preventDefault();
/*对事件采取行动*/
//要删除的行的id
var id=$(this.attr('data-id');
var token=$(this).data(“token”);
console.log(id);
//要删除的行
var行=$(this.parent(“td”).parent(“tr”);
var message=“主题”;
bootbox.dialog({
消息:“是否确实要删除此“+消息+”?”,
标题:“删除!”,
按钮:{
成功:{
标签:“否”,
类名:“btn成功”,
回调:函数(){
$('.bootbox').modal('hide');
}
},
危险:{
标签:“删除!”,
类名:“btn危险”,
回调:函数(){
$.ajaxSetup({
标题:{
'X-CSRF-TOKEN':$('meta[name=“CSRF-TOKEN”]).attr('content'))
}
});
$.ajax({
键入:“删除”,
url:'/subjects/delete/'+id,
数据:{
“id”:id,
“_方法”:“删除”,
“_令牌”:令牌
}
})
.完成(功能(响应){
bootbox.alert(response.success);
//删除已删除的行
jQuery(行).fadeOut('slow');
})
.fail(函数(){
bootbox.alert('出现问题…请与管理员联系');
})
}
}
}
});
});
以下是我不使用php artisan route:list时得到的结果


将ajax调用中的类型更改为POST,只需数据对象中的_method字段即可。这就是ajax调用的外观。Laravel通过使用_method字段确定http谓词来“伪造”DELETE方法

$.ajax({
键入:“POST”,
url:'/subjects/delete/'+id,
数据:{
“_方法”:“删除”,
“_令牌”:令牌
}
})
.完成(功能(响应){
bootbox.alert(response.success);
//删除已删除的行
jQuery(行).fadeOut('slow');
})
.fail(函数(){
bootbox.alert('出现问题…请与管理员联系');

})
我不知道为什么它会以这种方式工作的技术细节,但问题似乎来自我的控制器销毁方法。所以,这就是我所要做的:

控制器代码:

public function destroy($subject)
{
    //
    $response = array();

    $modal = new Subject; 
    $modal = Subject::find($subject);

    if ( $modal->delete() ) {
        $response['success'] = '<b>'.$modal->name.'</b>'.' successfully deleted';
        $response['subject'] = $modal;   
    }

    return \Response::json($response);

}
路线:

Route::delete('/subjects/delete/{subject}','SubjectsController@destroy');
对我来说,主要的事情是从
destroy()
参数中删除
Subject
,它就可以工作了。
如果你们中的任何人知道它为什么起作用,请提供和解释,以便我也能理解它。谢谢

php artisan route:list向您展示了关于该路由的哪些内容?不知道您真正想知道什么,所以我添加了一张从php artisan route:list获得的结果的图片。你可以查看这篇文章的更新。你不应该包括api中间件,因为你是通过ajax实现的吗?谢谢,但这不是我的问题,只是解决了它。即将发布一个关于我是如何让它工作的答案。感谢你的努力。很高兴听到你找到了答案,我很想知道问题出在哪里。
callback: function() {

                            $.ajaxSetup({
                                headers: {
                                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                                }
                            });

                            $.ajax({
                                type: 'DELETE',
                                url: '/subjects/delete/'+id,
                                data:{"id": id, "_method": 'DELETE'}
                            })
                           .done(function(response){
                                bootbox.alert(response.success);
                                //removing the row that have been deleted
                                jQuery(row).fadeOut('slow');
                            })
                           .fail(function(){
                                bootbox.alert('Something Went Wrong .... Please contact administrator');
                            })
                        }
Route::delete('/subjects/delete/{subject}','SubjectsController@destroy');