jQuery DataTable 更新 table 的第一行而不是选定的行

jQuery DataTable updates the first rows of the table not the selected ones

我有一个 Laravel 应用程序,我在其中使用 jQuery DataTables 来更新一些记录。我从数据库中检索这些记录,我必须确认它们。在 DataTable 上,我在最后一列有一个复选框。

现在我可以在select复选框时更新数据库中的记录,但更新的记录与复选框行上的记录不对应。这是更新前的:

这是记录更新后的样子:

如您所见,更新的是月份 = 3 的记录,而不是月份 = 4 的记录。

控制器上的代码如下:

public function update(Request $request)
{
    $user = Auth::user();
    $is_validated = $request->get('is_validated');
    $rec_id = $request->get('id');
    $reports = [];
    foreach($is_validated as $key => $valid){
        $id = $rec_id[$key];
        if(!empty($valid)){
            $reports[] = DB::table('reports')->where('reports.id', $id)->update(['is_validated' => 1, 'validated_by' => $user->id]);
        }else{
            $reports[] = DB::table('reports')->where('reports.id', $id)->update(['is_validated' => 0, 'validated_by' => $user->id]);
        }
    }
}

感谢所有帮助或提示。

编辑

我尝试对列重新排序,并且更新了数据表中的第一列,无论它们的 ID 是什么。

编辑 2

这里是设置请求参数的javascript

columns: [
            {data: 'id', name: 'reports.id'},
            {data: 'month', name: 'reports.month'},
            {data: 'value', name: 'reports.value'},
            {data: 'comment', name: 'reports.comment'},
            {data: 'is_validated', name: 'reports.is_validated'},
        ],
        "columnDefs": [ {
            "targets": [0],

            "render": function ( data, type, full, meta ) {
                return '<input type="text" name="id[]" data-name"id-' + meta.row + '" value="'+data+'" class="hidden"/>';
            }
        },{
            "targets": [4],

            "render": function ( data, type, full, meta ) {
                return '<input name="is_validated[]" data-name"is_validated-' + meta.row + '" class="checkbox" type="checkbox" unchecked/>';
            }
        }
    ]

您的代码存在多个问题,但主要是浏览器为所有文本框发送 id[] 参数,但只有那些 is_validated[] 包含选中值的参数,因此两个数组的长度不同并且您在 PHP.

中错误地计算了您的 ID

相反,您需要为每个复选框设置一个等于记录 ID 的值。在服务器端,您需要检查 id[]is_validated[] 中是否存在两个 ID;如果是,则复选框被选中,否则不被选中。

修改后的代码如下:

JavaScript:

columns: [
   {
      data: 'id', 
      name: 'reports.id',
      "render": function ( data, type, full, meta ) {
         return '<input type="text" name="id[]" data-name="id-' + meta.row + '" value="'+data+'" class="hidden"/>';
      }
   },
   {data: 'month', name: 'reports.month'},
   {data: 'value', name: 'reports.value'},
   {data: 'comment', name: 'reports.comment'},
   {
      data: 'is_validated', 
      name: 'reports.is_validated',
      "render": function ( data, type, full, meta ) {
         return '<input name="is_validated[]" data-name="is_validated-' + meta.row + '" class="checkbox" type="checkbox" value="' + full['id'] + '"/>';
      }
   },
],

PHP:

public function update(Request $request)
{
    $user = Auth::user();
    $is_validated = $request->get('is_validated');
    $rec_id = $request->get('id');
    $reports = [];
    foreach($rec_id as $id){
        if(in_array($id, $is_validated)){
            $reports[] = DB::table('reports')->where('reports.id', $id)->update(['is_validated' => 1, 'validated_by' => $user->id]);
        } else {
            $reports[] = DB::table('reports')->where('reports.id', $id)->update(['is_validated' => 0, 'validated_by' => $user->id]);
        }
    }
}