Laravel中点击带图标删除按钮无法按ID删除数据问题求助
问题原因
- 视图结构错误:删除按钮内部的
<a>标签无内容,点击按钮时实际未触发<a>的跳转逻辑 - 请求方法不匹配:路由定义为
DELETE请求类型,而<a>标签默认发起GET请求,请求类型不匹配无法触发对应的控制器逻辑 - 循环变量冲突:
@foreach ($books as $books)写法错误,循环内会覆盖原本的集合变量,可能导致数据读取异常
解决方案(推荐,符合Laravel规范,保留原有按钮样式)
1. 修正视图代码
首先修正循环变量,再将删除按钮改为表单提交方式,完整视图代码如下:
@foreach ($books as $book) {{-- 修正循环变量名 --}} <tr> <td>{{$book->id}}</td> <td>{{$book->name}}</td> <td>{{$book->year}}</td> <td>{{$book->publisher}}</td> <td> <button type="button" class="btn btn-info" title="details"><i class="fa fa-info" ></i></button> <button type="button" class="btn btn-warning" title="edit"><i class="fa fa-pencil" ></i></button> {{-- 新增DELETE请求表单 --}} <form action="{{ route('deletebook', $book->id) }}" method="POST" onsubmit="return confirm('Are you sure to delete this book?')" style="display: inline-block;"> @csrf @method('DELETE') <button type="submit" class="btn btn-danger" title="delete"> <i class="fa fa-trash"></i> </button> </form> </td> </tr> @endforeach
2. 可选优化控制器代码
可增加数据存在性判断,避免删除不存在的id时报错:
public function deleteBook($id) { DB::table('books')->where('id', $id)->delete(); return redirect('home')->with('status', 'DELETE succesfully'); }
3. 路由无需修改
原有路由代码可正常使用:
Route::delete('/deleteBook/{id}','BooksController@deleteBook')->name('deletebook');
其他可选方案(不推荐,仅做参考)
如果不想用表单提交,可将路由改为GET类型,同时调整<a>标签结构包裹按钮:
- 修改路由:
Route::get('/deleteBook/{id}','BooksController@deleteBook')->name('deletebook');
- 修改删除按钮部分代码:
<a href="{{ route('deletebook',[$book->id])}}" onclick="return confirm('Are you sure to delete this book?')"> <button type="button" class="btn btn-danger" title="delete"> <i class="fa fa-trash"></i> </button> </a>
该方案不符合RESTful规范,且存在爬虫误删数据的风险,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者Shabrina Nurdiani S
相关产品推荐
相关产品推荐

