Querybuilder Eloquent不会从模型中删除记录

时间:2018-04-18 14:03:30

标签: php laravel eloquent

我试过用3种方式创建通用删除功能。

function DeleteByID($table, $id){
1.    DB::table("$table")->delete("$id");
2.    DB::table("$table")->find("$id")->delete();
3.    DB::table("$table")->where('id', '=', "$id")->delete();
}

我正在使用ajax将请求发送到Ajax Controller类,该类将其发送到特定主题的相应控制器类。使用ajax请求一切顺利,它会做它应该做的事情。但是从表中删除某些内容不起作用。

是的,当我调用DeleteByID($table, $id)函数时,我正在将正确的表名放入$ table参数中。

更新1

从ajax请求中删除每个双""到删除函数的调用。

DB::table($table)->where('id', '=', $value)->delete();

现在是什么。仍然无效。

更新2

这会触发DeleteRole功能。这将打开一个模态,询问您是否确定要删除该记录。将会有另一个带有onclick="DeleteRole(this.id, true)"的按钮,其中包含id随之发送的信息。

<a id="{{$role->id}}" onclick="DeleteRole(this.id, false)">
     <button class="btn btn-neutral btn-icon btn-round" data-toggle="modal" 
     id="{{$role->id}}" data-target="#rolesModalDelete">
          <i class="material-icons" style="color:rgba(185,14,22,0.81)">clear</i>
     </button>
</a>

AJAX请求:

function DeleteRole(id, bool){
    let contentModal = $('#DeleteRoleContent');
    if(bool === false){
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
            url: '/DeleteRole',
            type: 'POST',
            dataType: "json",
            beforeSend: function (xhr) {
                const token = jQuery('meta[name="csrf_token"]').attr('content');
                if (token) {
                    return xhr.setRequestHeader('X-CSRF-TOKEN', token);
                }
            },
            data: {
                roleID: id,
                popup: bool,
            },
            success: function (data) {
                contentModal.empty();
                contentModal.append(data);
            }
        });
    }else if (bool === true){
        let row = $('#' + id);
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
            url: '/DeleteRole',
            type: 'POST',
            dataType: "json",
            beforeSend: function (xhr) {
                const token = jQuery('meta[name="csrf_token"]').attr('content');
                if (token) {
                    return xhr.setRequestHeader('X-CSRF-TOKEN', token);
                }
            },
            data: {
                roleID: id,
                popup: bool,
            },
            success: function (data) {
                row.empty();
            }
        });
    }

}

更新3

if语句检查$_POST['popup']是否为真,但被忽略。更改了它,因此删除现在可以正常工作。但是现在不会调用成功处理程序。 ajaxrequest返回200 OK。

    public function RoleDelete()
    {
    if($_POST['roleID']){
        if($_POST['popup'] == 0){
           $htmlObject = $this->roleController->GetData($_POST['roleID']);
           echo json_encode($htmlObject);
        } else {
            if($_POST['roleID'] !== null) {
                $this->db->DeleteByID('rollen', $_POST['roleID']);
            } else {
                echo json_encode('ID is null');
            }
        }
    } else {
        echo json_encode('Geen gegevens gevonden, is het record al verwijderd? AC 256;');
    }
}

3 个答案:

答案 0 :(得分:1)

你应该试试这个

请勿使用&#34;&#34; 作为变量

1.    DB::table($table)->delete($id);
2.    DB::table($table)->find($id)->delete();
3.    DB::table($table)->where('id', '=', $id)->delete();

答案 1 :(得分:1)

我很抱歉,如果这是“确保它插入”的答案,但有时简单的东西是最容易被忽视的,特别是当你对代码进行隧道视觉时。也就是说,您确定您的数据库凭据实际上具有删除权限吗?

答案 2 :(得分:0)

if语句检查$ _POST ['popup']是否为真,被忽略。更改了它,因此删除现在可以正常工作。但是现在不会调用成功处理程序。 ajaxrequest返回200 OK。

public function RoleDelete(){
   if($_POST['roleID']){
      if($_POST['popup'] == 0){
         $htmlObject = $this->roleController->GetData($_POST['roleID']);
         echo json_encode($htmlObject);
      } else {
        if($_POST['roleID'] !== null) {
            $this->db->DeleteByID('rollen', $_POST['roleID']);
        } else {
            echo json_encode('ID is null');
        }
      }
   } else {
    echo json_encode('Geen gegevens gevonden, is het record al verwijderd? AC 256;');
   }
}