我正在尝试通过axios向laravel发送删除请求,如下所示:
axios.delete('api/users/' + this.checkedNames)
.then((response) => {
console.log(response)
}, (error) => {
// error callback
})
Run Code Online (Sandbox Code Playgroud)
现在从axios文档中我读到,对于删除请求,我们应该使用configObject,以便可以将上述内容重写为:
axios.delete('api/users/', {params: {ids:
this.checkedNames})
.then((response) => {
console.log(response)
}, (error) => {
// error callback
})
Run Code Online (Sandbox Code Playgroud)
然后我Route::resource('users', 'UsersController');
在api.php中,因此删除的默认路由为:
DELETE| api/users/{user}| users.destroy
Run Code Online (Sandbox Code Playgroud)
控制器的方法是:
|App\Http\Controllers\UsersController@destroy
Run Code Online (Sandbox Code Playgroud)
当我传递单个ID(例如api / users / 12)时,我能够按预期删除用户,它可以正确删除,但是当我尝试传递上述数组时,事情就变得复杂了。
如果我按照axios文档进行尝试,axios.delete('api/users/', {params: {id: this.checkedNames}})
它似乎是在发送此消息,http://lorillacrud.dev/api/users?id[]=21&id[]=20
但我得到的是405方法不允许。
如果我尝试axios.delete('api/users/' + this.checkedNames )
,我得到http://lorillacrud.dev/api/users/20,21
我的破坏方法,我可以抢IDS和删除等等,但我想知道这是否是做了正确的方法是什么?
我似乎使它工作了,但是我不明白,因此仍然感谢任何帮助以使我了解我实际上正在做什么!
因此,如果更改为:
axios.delete('api/users/destroy', {params: {'id': this.checkedNames})
Run Code Online (Sandbox Code Playgroud)
在我的销毁方法中:
if ($request->id) {
foreach ($request->id as $id) {
User::destroy($id);
}
}
User::destroy($id);
}
Run Code Online (Sandbox Code Playgroud)
所以...
// not deletes the user
axios.delete('api/users/destroy', {params: {id: id}})
// ok deletes the users when using request->id in a for loop in the destroy laravel method.
axios.delete('api/users/destroy', {params: {ids: this.checkedNames}})
// ok deletes one user
axios.delete('api/users/' + id)
Run Code Online (Sandbox Code Playgroud)
对不起,但我有很多困惑,为什么以及什么!
路由名称是user.destroy
为什么当我传递数组时它起作用,而当我传递单个值时它却不起作用,为什么反之亦然,使用方法delete的路由在传递数组时不会删除?
api/users/destroy
与api/users
仅使用之间有什么区别?
感谢您的帮助!
我也遇到了同样的问题。这对我有用:
deletePost: function(id) {
axios.post('/posts/'+id,{_method: 'delete'})
}
Run Code Online (Sandbox Code Playgroud)
使用axios.post()
代替axios.delete
,并发送_method
“删除”
这是因为方法签名。delete
使用时的默认路由Resource
需要一个参数。所以在做的时候:
axios.delete('api/users', {params: {'id': this.checkedNames})
Run Code Online (Sandbox Code Playgroud)
您缺少必需的参数。路线定义为
Route::delete('api/users/{id}', 'UserController@destroy');
// You are missing `id` here. So it won't work.
Run Code Online (Sandbox Code Playgroud)
通常,如果您打算偏离默认行为,建议创建自己的函数。因此,您可以保留默认destroy($id)
功能,即删除单个条目,然后编写一个将删除许多功能的新功能。首先为其添加一条路线
Route::delete('api/users', 'UserController@deleteMany');
Run Code Online (Sandbox Code Playgroud)
然后定义函数来处理它
public function deleteMany(Request $request)
{
try
{
User::whereIn('id', $request->id)->delete(); // $request->id MUST be an array
return response()->json('users deleted');
}
catch (Exception $e) {
return response()->json($e->getMessage(), 500);
}
}
Run Code Online (Sandbox Code Playgroud)
总而言之,您的问题来自路线定义。您来自Axios的路线与来自Laravel的路线定义(405)不匹配。
归档时间: |
|
查看次数: |
16363 次 |
最近记录: |