我在保存JSON数组时遇到一些问题。
我有一个下拉菜单,可以通过该下拉菜单使用ajax获取学生数据。我可以获取学生数据,但是现在我想在单击“保存”按钮后存储此数据。现在,当我做return dd($request->all())
时;这在我的存储操作中,然后给了我JSON数组,其中所有必需的数据都可用,但是当我尝试获取单个值时,它给了我null值。下面是我的代码
<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());
}
答案 0 :(得分:1)
更改您的JavaScript脚本:
var formdata = $('#studentsData').find('select, input').serializeArray();
var data = {};
$(formdata ).each(function(index, obj){
data[obj.name] = obj.value;
});
data[class_id] = $('[name="class_id"]').val();
$.post('/students/attendance', data, function(response){
console.log(response);
});
答案 1 :(得分:1)
您需要做的第一件事是将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();
}
}