Php 如何通过ajax删除laravel中的记录
我知道在这个问题上也有类似的问题,但我已经在那些答案正确的问题之后尝试了我的副本,但仍然无济于事。 我不断地发现这个错误: BadMethodCallException方法删除不存在。在Macroable.php中(第74行) 为了快速,这是我的控制器: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
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');