【问题标题】:DELETE not working in the Laravel DatatableDELETE 在 Laravel 数据表中不起作用
【发布时间】:2020-02-10 11:04:46
【问题描述】:

我正在使用 Laravel Datatable,但我一直坚持下去。下面的代码用于删除 TagManagement 模型中的条目。但它并没有删除条目,更糟糕的是它没有显示任何错误。任何人都可以在下面的代码中找到错误吗?

查看

 $(document.body).on("click",".remove-tag", function () {

        var tag_id = $(this).data('id');
        showConfirm("DELETE", "Do you want to delete this Tag ?","deleteTag("+tag_id+")");
    });

    function deleteTag(id){
        $.ajax({
            type: 'get',
            url: '{!! url('delete-tag') !!}',
            data: {tag_id: id},
            success: function (data) {
                    if (data == "SUCCESS") {
                        $('[data-id="' + id + '"]').closest('tr').remove();
                        showAlert("SUCCESS","Delete Tag successful");
                    }
                }, error: function (data) {

                    showAlert("FAIL","Delete Tag fail");
                }

        });
    }
        var tag_id = $(this).data('id');
        showConfirm("DELETE", "Do you want to delete this Tag ?","deleteTag("+tag_id+")");
    });

    function deleteTag(id){
        $.ajax({
            type: 'get',
            url: '{!! url('delete-tag') !!}',
            data: {tag_id: id},
            success: function (data) {
                    if (data == "SUCCESS") {
                        $('[data-id="' + id + '"]').closest('tr').remove();
                        showAlert("SUCCESS","Delete Tag successful");
                    }
                }, error: function (data) {

                    showAlert("FAIL","Delete Tag fail");
                }

        });
    }

控制器

public function destroy($id)
    {

        $tagManagement = TagManagement::find($id);
        $deleted = $tagManagement->delete();

        if ($deleted) {
            return "SUCCESS";
        } else {
            return "FAIL";
        }
    }

public function loadTags()
{

    $Tags = TagManagement::all();

    return DataTables::of($Tags)
        ->addColumn('action', function ($tag) {
            return '<a href="' . url('/tags/' . $tag->id . '/edit') . '" class="btn btn-default edit_btn_styles" data-toggle="tooltip" data-placement="top" title="Edit"><i class="fa fa-wrench" aria-hidden="true"></i></a>
                    <button type="button" data-id="' . $tag->id . '" class="btn btn-default remove-tag remove-btn" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fas fa-trash-alt" aria-hidden="true"></i></button>';
        })
        ->rawColumns(['action'])
        ->make(true);
}

}

**Route**

Route::get('/delete-tag', 'AdminPanel\TagController@destroy');


【问题讨论】:

  • 你检查过destroy方法中$id的值吗?也让我知道条目是否从数据库中删除?
  • 它没有从 DB 中删除。是的,我已经检查过了。它什么也没看到。
  • 首先打印您的查询并在控制台中执行。它将确保执行正确的查询。或者你可以简单地使用 DB:table('table name')->where('id', $id))->delete()

标签: php laravel yajra-datatable


【解决方案1】:

您的路线和控制器方法似乎不对应。首先,最好使用“删除”HTTP 请求方法进行删除操作,但这不是导致您的问题的原因。

您将路由定义为/delete-tag,但在您的控制器中,您希望$id 作为destroy 方法的参数。为了让它工作,你需要有这样的路由 /delete-tag/{id} 并在前端相应地为你的 ajax 调用构造 URL。我很惊讶您没有收到 Missing argument 1 for App\Providers\RouteServiceProvider::{closure}() 异常,因为您以这种方式错误地提出了您的请求。

Laravel documentation很好的解释了如何用参数定义路由。

如果您在问题中包含 Laravel 版本会很有帮助。

这是它的工作原理:

路线定义

Route::delete('/delete-tag/{id}', 'AdminPanel\TagController@destroy')->name('delete-tag');

JS函数

function deleteTag(id){
        let route = '{!! route('delete-tag', ['id' => '%id%']) !!}';
        $.ajax({
            type: 'post',
            url: route.replace('%id%', id);,
            data: {_method: 'delete'},
            success: function (data) {
                    if (data == "SUCCESS") {
                        $('[data-id="' + id + '"]').closest('tr').remove();
                        showAlert("SUCCESS","Delete Tag successful");
                    }
                }, error: function (data) {

                    showAlert("FAIL","Delete Tag fail");
                }

        });
    }

【讨论】:

  • 刚刚编辑以包含代码的工作版本。
【解决方案2】:

这不是您的 Datatable 问题,您错过了一些代码,您没有正确定义 routejQuery function,您的 destroy($id) 函数收到了一个参数,但您在 route 中没有收到任何参数不要在你的ajax操作中发送_token,你需要发送_token

检查我的代码 我正在编辑您的代码。

//Change your Route
Route::get('delete-tag/{id}', 'AdminPanel\TagController@destroy')->name('deleteTag');

//Change your function
function deleteTag(id){
    $.ajax({
        type: "GET",
        dataType: 'JSON',
        url:'{{ route('deleteTag', '') }}/'+id,
        data: {_token: '{{csrf_token()}}'},
        success: function (data) {
            if (data == "SUCCESS") {
                $('[data-id="' + id + '"]').closest('tr').remove();
                showAlert("SUCCESS","Delete Tag successful");
            }
        }, error: function (data) {

            showAlert("FAIL","Delete Tag fail");
        }
    });
}

【讨论】:

  • 现在它正在工作,但不是 SUCCESS","Delete Tag successful 它看到的是 FAIL, Delete Tag fail
猜你喜欢
  • 2018-01-21
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多