首页 > 解决方案 > 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());
}

标签: jsonlaravel

解决方案


您需要做的第一件事是将 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();
    }
}

推荐阅读