首页 > 解决方案 > 如何在数据库中存储多维数组 - 使用 laravel 5.8

问题描述

我想将学生的课程信息保存到数据库课程表中。学生可以使用表格一次添加多个课程、上课时间和部分。以下是课程表的详细信息:

**ID,
nsu_id
课程,
部分,
类开始,
类结束**

表格(查看)

            <form method="POST" action="/store">
            @csrf
            {{-- clone start from here --}}  
                <div class="parent">
                    <div id="form-set">
                        <div class="form-group row">
                            <label for="course" class="col-md-4 col-form-label text-md-right">{{ __('Course & Section') }}</label>

                            <div class="col-md-3">
                                <select type="text" class="form-control" name="course[]">
                                    <option>Course</option>
                                    <option>cse 115</option>
                                    <option>cse 215</option>
                                    <option>cse 311</option>
                                    <option>cse 411</option>
                                </select>
                            </div>
                            <div class="col-md-3">
                                <select type="number" class="form-control" name="section[]">
                                    <option>Section</option>
                                    <option>1</option>
                                    <option>2</option>
                                    <option>3</option>
                                    <option>4</option>
                                </select>
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="Class Timing" class="col-md-4 col-form-label text-md-right">{{ __('Class Timing') }}</label>

                            <div class="col-md-3">
                                <select type="text" class="form-control" name="class_start[]">
                                    <option>Start</option>
                                    <option>08:00 AM</option>
                                    <option>09:40 AM</option>
                                    <option>11:20 AM</option>
                                    <option>01:00 PM</option>
                                    <option>02:40 PM</option>
                                    <option>04:20 PM</option>
                                </select>
                            </div>
                            <div class="col-md-3">
                                <select type="text" class="form-control" name="class_end[]" >
                                    <option>End</option>
                                    <option>9:30</option>
                                    <option>11:10</option>
                                    <option>12:50</option>
                                    <option>2:30</option>
                                    <option>4:10</option>
                                    <option>5:50</option>
                                </select>
                            </div>
                        </div>

                    </div>
                </div>
                <div class="form-group row justify-content-center"  style="margin-top: -11%">
                    <div class="col-md-10" style="visibility: hidden"></div>
                    <div class="col-md-2">
                        <button class="btn btn-xs btn-success" id="add">Add</button>
                    </div>
                </div>
                <script type="text/javascript">
                    $(document).ready(function () {
                        $('#add').click(function(e) {
                            e.preventDefault();
                            $("#form-set").clone().appendTo(".parent");
                        });
                    });
                </script>
           {{-- Clone end here --}}

                <div class="form-group row">
                    <label for="nsu_id" class="col-md-4 col-form-label text-md-right">{{ __('NSU ID') }}</label>

                    <div class="col-md-6">
                        <input type="number" required class="form-control" name="nsu_id"  placeholder="Exp. 1520836042">
                    </div>
                </div>

                <div class="form-group row mb-0">
                    <div class="col-md-6 offset-md-4">
                        <button type="submit" class="btn btn-primary">
                            {{ __('Register') }}
                        </button>
                    </div>
                </div>
            </form>

模型

class Course extends Model
{
  protected $table='courses';
  protected $fillable=[
    'nsu_id','course','section','class_start','class_end'
  ];

}

移民

public function up()
{
    Schema::create('courses', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('nsu_id');
        $table->string('course');
        $table->integer('section');
        $table->string('class_start');
        $table->string('class_end');
        $table->timestamps();
    });
}

这就是我对控制器所做的,我得到了数组到字符串转换异常

    公共功能存储(请求 $request)
    {
     $data[]=$request->all();
     //dd($data);
     $课程数据=[];
     foreach($data 作为 $data){
         $点数据[]=[
             'nsu_id'=>$data['nsu_id'],
             '课程'=>$数据['课程'],
             'section'=>$data['section'],
             'class_start'=>$data['class_start'],
             'class_end'=>$data['class_end'],
         ];
     }
     DB::table('courses')->插入($courseData);

     返回重定向()->to('/home');
    }

当我尝试使用辅助函数dd($data);获取值时

    数组:1 [▼
      0 => 数组:6 [▼
        "_token" => "2AspZiawULQy4fMikkBTRzjvUxPVnZPPonJrZAUy"
        “课程” => 数组:2 [▼
          0 => "cse 115"
          1 => "cse 215"
        ]
        “节” => 数组:2 [▼
          0 => "1"
          1 => "2"
        ]
        "class_start" => 数组:2 [▼
          0 => "08:00 AM"
          1 =>“上午 9 点 40 分”
        ]
        "class_end" => 数组:2 [▼
          0 => "9:30"
          1 => "11:10"
        ]
        “nsu_id” => “1520836042”
      ]
    ]

错误:数组到字符串的转换(SQL:插入courses( class_end, class_start, course, nsu_id, section) 值 (9:30, 08:00 AM, cse 115, 1520836042, 1))

任何形式的帮助将不胜感激

标签: phpmysqldatabaselaravel

解决方案


我建议研究 Laravel 的 Eloquent ORM。从雄辩的文档

“每个数据库表都有一个对应的“模型”,用于与 > 该表进行交互。模型允许您查询表中的数据,以及 >将新记录插入表中。

$course = new Course();
$course->nsu_id = $request->nsu_id
$course->course = $request->course
$course->section = $request->->section
$course->class_start = $request->class_start
$course->class_end = $request->class_end
$course->save();

或者如果您配置为允许批量分配

Course::create($request);

此外,您应该查看对传入请求的验证,以确保您的用户没有犯错,或者某些不良行为者没有试图破坏您的应用程序。

编辑 1

根据评论,您不想尝试追求 Eloquent 解决方案。$data['course'], 是一个数组。由于您的数据库(如架构中定义的那样)需要一个字符串,这将是一个问题。因此,这里有一些关于如何将数组数据转换为字符串的想法。

逗号通过 implode() 分隔

foreach($data as $data){
         $pointData[]=[
             'nsu_id'=>$data['nsu_id'],
             'course'=>implode(',',$data['course']),
             'section'=>implode(',',$data['section']),
             'class_start'=>implode(',',$data['class_start']),
             'class_end'=>implode(',',$data['class_end']),
         ];
     }

通过 json_encode() 的 JSON 字符串

foreach($data as $data){
         $pointData[]=[
             'nsu_id'=>$data['nsu_id'],
             'course'=json_encode($data['course']),
             'section'=>json_encode($data['section']),
             'class_start'=>json_encode($data['class_start']),
             'class_end'=>json_encode($data['class_end']),
         ];
     }

编辑 2

在评论中,您询问如何进行多次插入

将多行插入数据库

查看Laravel 的 DB Insert Documentation,但这里是该页面的示例:

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);

推荐阅读