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]);
}
}
}
我有一个 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[]
和 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]);
}
}
}