php - 如何在数据库中存储多维数组 - 使用 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))
任何形式的帮助将不胜感激
解决方案
我建议研究 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]
]);
推荐阅读
- css - 如何根据跨度(在 texbox 旁边)设置带有错误类的文本框控件样式
- amcharts - AM Charts - 更改工具提示文本的颜色
- ssl - Kubernetes 错误:无法连接到服务器:拨打 tcp 127.0.0.1:8080
- html - 如何使链接不继承属性?
- node.js - 使用 Apache 将任何请求重定向到节点应用程序并将 http 重定向到 https
- sql - 在同一个选择中使用 DB2 列别名
- c# - 无法将 asp.net Web 表单连接到本地 mySQL 数据库
- css - 菜单布局问题
- python - 从 GitHub 存储库中获取版本号
- django - 使用 Django 2.0 通过电子邮件恢复密码时来自谷歌的错误 NET::ERR_CERT_COMMON_NAME_INVALID