json - Json 给出空值
问题描述
我在保存 JSON 数组时遇到了一些问题。
我有一个课程下拉列表,通过它我可以使用 ajax 获取学生数据。我可以获取学生数据,但现在我想在单击保存按钮后存储这些数据。现在当我这样做的时候return dd($request->all())
;这在我的商店操作中,然后它给了我所有必需数据可用的 JSON 数组,但是当我尝试获取单个值时,它给了我空值。下面是我的代码
我的阿贾克斯
<script>
$(document).ready(function() {
$(document).ready(function () {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});
$('select[name="class_id"]').on('change', function() {
var classID = $(this).val();
if(classID) {
$.ajax({
url: '/myform/ajax/'+classID,
type: "GET",
dataType: "json",
success:function(data) {
var attendance = `<div class="form-group">
<select class="form-control" id="attendance" name="attendance[]">
<option>Present</option>
<option>Absent</option>
<option>Leave</option>
</select>
</div>`;
var markup = '';
markup += '<tr> <th>#</th> <th>Student ID</th> <th>Student Name</th> <th>Attendance</th> <tr>';
$.each(data, function(key, value) {
markup += '<tr> <td><input type="hidden" value="'+value.id+'" name="id[]">' + value.id + '</td> <td><input type="hidden" value="'+value.student_id+'" name="student_id[]">' + value.student_id + '</td> <td><input type="hidden" value="'+value.first_name+'" name="first_name[]"><input type="hidden" value="'+value.last_name+'" name="last_name[]">' + value.first_name+ ' ' + value.last_name + '</td> <td> ' + attendance + '</td> <tr>';
});
$('table[id="studentsData"]').html(markup);
$('body').on('click', '#save-btn', function(e){
e.preventDefault();
var data = $('#studentsData').find('select, input').serialize();
var data = {data: data, class_id: $('[name="class_id"]').val()};
$.post('/students/attendance', {data: data}, function(response){
console.log(response);
});
});
}
});
}
});
});
</script>
学生考勤表结构
public function up()
{
Schema::create('students_attendances', function (Blueprint $table) {
$table->increments('id');
$table->integer('class_id')->index()->unsigned()->nullable();
$table->string('student_id');
$table->string('first_name');
$table->string('last_name');
$table->string('attendance');
$table->timestamps();
});
}
控制器
public function store(Request $request)
{
return dd($request->all());
}
解决方案
您需要做的第一件事是将 click 事件置于 change 事件之外(您不应该嵌套事件)。
第二个更改是删除第二个准备功能,您只需要第一个。
$('body').on('click', '#save-btn', function(e) {
e.preventDefault();
var data = $('#studentsData').find('select, input').serialize();
data = {
data: data,
class_id: $('[name="class_id"]').val()
};
$.post('/students/attendance', data, function(response) {
console.log(response);
});
});
注意:您不必声明data
两次,也不必像在 中那样将一个对象放入另一个对象中{data: data}
,因为data
它已经是一个对象,所以只需发送它。
关于序列化,您可以简单地使用parse_str()
:
parse_str($all['data'], $information)
现在您可以根据需要循环遍历$information
。
public function store(Request $request)
{
$info = \Illuminate\Support\Facades\Input::all();
$class_id = $info['class_id'];
parse_str($info['data'], $input);
foreach($input['student_id'] as $i => $student_id) {
StudentsAttendance::create([
'class_id' => $class_id ,
'student_id' => $student_id,
'first_name' => $input['first_name'][$i],
'last_name' => $input['last_name'][$i],
'attendance' => $input['attendance'][$i]
]);
return redirect()->back();
}
}
推荐阅读
- java - 如何使用 Spring Boot 数据 jpa 在 mysql 中功能性地更新编码密码
- stm32 - 如何读取 STM32F4 中 UART 应附带的所有数据?
- python - 在单台机器上运行多个 python 解释器的便捷方式。可以在脚本中指示解释器路径吗?
- javascript - 显示字数限制属性不起作用(element.eleme.io)
- vue.js - Vue 软件包版本与 Laravel 不匹配
- c - 为什么我可以将多个指针传递给单个指针参数?
- java - 为什么hibernate在保存child的时候需要保存parent,即使parent没有变化也会引发OptimisticLockException?
- javascript - javascript在innerhtml中格式化css
- sql - 在 DB2 时态表中将相同的行与相邻的 business_time 周期组合起来
- c++ - 如何使用共享基类迭代 std::tuple 的元素?