繁体   English   中英

Axios、Laravel 和 VueJS 中的删除方法

[英]Delete Method in Axios, Laravel and VueJS

我正在尝试通过 axios 向 laravel 发送删除请求,如下所示:

axios.delete('api/users/' + this.checkedNames)
.then((response) => {
    console.log(response)
}, (error) => {
    // error callback
})

现在从 axios 文档中我读到,对于删除请求,我们应该使用 configObject 以便上面可以重写为:

axios.delete('api/users/', {params: {ids:     
    this.checkedNames})
.then((response) => {
    console.log(response)
}, (error) => {
    // error callback
})

然后我有Route::resource('users', 'UsersController'); 在 api.php 中,因此删除的默认路由是:

DELETE| api/users/{user}| users.destroy 

控制器的方法是:

|App\Http\Controllers\UsersController@destroy

当我传递单个 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})

在我的销毁方法中:

    if ($request->id) {
        foreach ($request->id as $id) {
            User::destroy($id);
        }
    }
    User::destroy($id);
}

所以...

// 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)

对不起,伙计们,但我很困惑为什么和什么!!!

路由名称是user.destroy为什么当我传递一个数组时它会起作用而当我传递一个值时它不起作用,为什么反之亦然带有方法 delete 的路由在传递一个数组时不会删除???

仅使用api/users/destroyapi/users什么区别?

感谢您对此的任何帮助!

这是因为方法签名。 使用Resource时的默认delete路由需要一个参数。 所以在做的时候:

axios.delete('api/users', {params: {'id': this.checkedNames})

你缺少一个必需的参数。 路由定义是

Route::delete('api/users/{id}', 'UserController@destroy');
// You are missing `id` here. So it won't work. 

通常,如果您打算偏离默认行为,建议您创建自己的函数。 因此,您可以保留默认的destroy($id)函数以删除单个条目并编写一个将删除多个条目的新函数。 首先为它添加一个路由

Route::delete('api/users', 'UserController@deleteMany');

然后定义函数来处理它

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);
    }
}

总而言之,您的问题来自路线定义。 您来自 Axios 的路线与来自 Laravel 的路线定义不匹配,因此是 405。

我也遇到了同样的问题。 这对我有用:

deletePost: function(id) {
                axios.post('/posts/'+id,{_method: 'delete'})
            }

使用axios.post()而不是axios.delete ,并发送_method "delete"

我在发出删除请求时遇到了将数据作为模型发送的问题。 我找到了如下修复方法:

deleteCall (itemId, jsonModel) {
return api.delete(`/users/${itemId}/accounts/`, {data: jsonModel})
},

删除数组中的用户

另一个不错的选择是将 javascript 数组转换为字符串,并传递它具有所需的参数,而不是传递对象。 这里的例子:

在 Vue.js 2.5.17+ 中

//Use the javascript method JSON.stringify to convert the array into string: axios.delete('api/users/' + JSON.stringify(this.checkedNames))

在 Laravel 5.3+

//Resource default route (you don't need to create, it already exists)
Route::delete('api/users/{id}', 'UserController@destroy'); 

//In laravel delete method, convert the parameter to original array format 
public function destroy($id)
{
    User::destroy(json_decode($id); //converting and deleting users in array 'id'
}

通过id删除单个用户

只需传递id。 你不需要转换它。

在 Vue.js 2.5.17+ 中

axios.delete('api/users/' + id)

在 Laravel 5.3+

您可以根据需要命名参数: useriditem 、...

In Laravel 5.6+ < is named as $id //this can be the id or the user object
In Laravel 5.7+ > is named as $user //this can be the id or the user object

public function destroy($id)
{
    User::destroy($id); 
}
axios.post('/myentity/839', {
  _method: 'DELETE'
})
.then( response => {
   //handle success
})
.catch( error => {
   //handle failure
})

https://www.mikehealy.com.au/deleting-with-axios-and-laravel/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM