Laravel 使用 destroy 方法删除条目

Posted

技术标签:

【中文标题】Laravel 使用 destroy 方法删除条目【英文标题】:Laravel delete entry with destroy method 【发布时间】:2016-08-07 10:45:14 【问题描述】:

我有一个带有删除按钮的表单,我在控制台上看到它正在发送删除请求。

jquery.js:4 DELETE http://laravel.com/painel/player/53 500 (Internal Server Error)

我的路线是:

Route::resource('painel/player','PlayerController');


| DELETE    | painel/player/player      | painel.player.destroy | App\Http\Controllers\PlayerController@destroy    |

我的销毁方法如下:

    public function destroy($id)
    
            $player = Player::where('id_player', '=', $id)->first();
            $player->delete();
            $player = array(
                    'users'         => Player::all(),
                    'refresh'       => true
            );
            return View::make('painel.player.show', $player);
    

编辑: 我忘了提到ajax:

    $( document ).on('click', '.solsoConfirm', function()
        $("#solsoDeletForm").prop('action', $(this).attr('data-href'));
    );

    $( document ).on('click', '.solsoDelete', function(e)
        e.preventDefault();

        var solsoSelector   = $(this);
        var solsoFormAction = $('#solsoDeletForm').attr('action');

        $.ajax(
            url:    solsoFormAction,
            type:   'delete',
            cache:  false,
            dataType: 'html',
            success:function(data) 
                $('#solsoDeleteModal').modal('hide');
                $('#ajaxTable').html(data);
                $('#countClients').text( $('.solsoTable').attr('data-all') );
                $.growl.notice( title: solsoSelector.attr('data-message-title'), message: solsoSelector.attr('data-message-success') );
                $('.solsoTable').dataTable();
            
        ); 

        return false;
    );     

【问题讨论】:

你是如何定义控制器的路由的,是资源控制器还是隐式控制器?您能否也包含您的routes.php 代码。 它是一个资源控制器。这有什么区别吗? 如果你有它作为一个隐式控制器,它会。无论如何,您可以将您的控制器和routes.php 完整代码发布到问题中吗? 对不起,这是一个 AJAX 请求。我刚刚编辑了问题... 我知道这是一个 AJAX 请求,但您必须为您正在发出的删除请求定义了 路由(很可能在文件 routes.php 中),那么你能发布它的内容以及destroy方法的完整控制器代码吗? 【参考方案1】:

虽然您的 $.ajax( ... type: 'delete' ... ) 应该可以工作,但您需要 set up your response to accept the 'delete' method。

在 Laravel 中执行 PUT、PATCH 和 DELETE 的另一种标准方法是通过 method spoofing:

<form action="painel/player/ $id " method="POST">
     method_field('DELETE') 
     csrf_field() 
</form>

您的 JS 可能类似于:

var csrf = $('input[name="_token"]').val();

$.ajax(
    url: solsoFormAction,
    type: 'post',
    data: _method: 'delete', _token: csrf,
    ...
); 

【讨论】:

顺便说一句,500 错误的实际内容可能会告诉您问题出在哪里 - 您应该能够在浏览器的开发人员工具中看到它。 它不工作......开发工具只说“500(内部服务器错误)”..它说错误是在ajax方法上..如果我发送请求而不是ajax请求.. 它有效。 在开发工具中,切换到网络选项卡,然后单击 POST。您应该会看到“标题”和“响应”以及其他一些内容。单击响应 - 你应该会看到 Laravel 生成的完整响应,它将描述问题。如果找不到,请检查 Laravel 日志文件。您是否更新了 AJAX 代码以发送 _method 和 _token?

以上是关于Laravel 使用 destroy 方法删除条目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中的 destroy() 和 delete() 方法有啥区别?

没有 id 的 Laravel 资源路由销毁(DELETE)

如何在 Destroy 函数中删除具有多个参数的数据 - Laravel

laravel 无法删除记录

Laravel 函数 Model::destroy() 中的参数太少

Laravel 缺少 [Route: destroy] 所需的参数。