Json给出空值

时间:2019-04-02 12:53:46

标签: json laravel

我在保存JSON数组时遇到一些问题。

我有一个下拉菜单,可以通过该下拉菜单使用ajax获取学生数据。我可以获取学生数据,但是现在我想在单击“保存”按钮后存储此数据。现在,当我做return dd($request->all())时;这在我的存储操作中,然后给了我JSON数组,其中所有必需的数据都可用,但是当我尝试获取单个值时,它给了我null值。下面是我的代码

我的ajax

<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());
}

2 个答案:

答案 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();
    }
}