如何在数据库中存储多维数组-使用laravel 5.8



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

**id,nsu_id课程部分class_ start,class_end**

窗体(视图(

<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$Request({$data[]=$request->all((;//dd($data(;$courseData=[];foreach($data作为$data({$pointData[]=['nsu_id'=>$data['nsu_id'],'course'=>$data['course'],'section'=>$data['section'],'class_start'=>$data['class_start'],'class_end'=>$data['class_end'],];}DB::table('courses'(->insert($courseData(;return redirect((->to('/home'(;}

当我尝试使用helper函数dd($data(获取值时

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

错误:数组到字符串的转换(SQL:插入到courses(class_endclass_startcoursensu_idsection(值(上午9:30、08:00,cse 1151520836042,1((

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

我建议查看Laravel的Eloquent ORM。来自Eloquent文档:

"每个数据库表都有一个相应的";型号";其用于与>那张桌子。模型允许您查询表中的数据,以及>在表中插入新记录">

$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);

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

编辑1

根据评论,你不想试图追求Eloquent解决方案$data["course"]是一个数组。由于在模式中定义的数据库需要一个字符串,所以这将是一个问题。因此,这里有一些关于如何将数组数据转换为字符串的想法。

通过内爆((分离的逗号

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文档,但下面是该页面中的示例:

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

首先,控制器中的foreach非常奇怪。为什么?:

foreach $data as $data

AND,使$courseData为空,并将其交给insert。

固定版本:

public function store(Request $request)
{
$data[]=$request->all();
$courseData=[];
foreach($data as $d){
$courseData[]= [
'nsu_id'=> $d['nsu_id'],
'course'=> $d['course'],
'section'=> $d['section'],
'class_start'=> $d['class_start'],
'class_end'=> $d['class_end'],
]
}
DB::table('courses')->insert($courseData);
return redirect()->to('/home');
}

您遇到的错误是给insert方法一个空数组作为输入,而不是字符串。

在解决了这个问题后,你会意识到你的代码仍然不起作用,因为你的post值也是一个数组,你必须重新考虑表单的输入名称,并重建你的数据,以获得更简单、更可用的逻辑表单。

花了很多时间后,我成功地用不同的方式解决了自己的问题。感谢@mchljams的友好协助和合作。

$nsu_id=$request->nsu_id;
if (count($request->course)>0) {
foreach($request->course as $item => $value)
$data[$value]=array(
'nsu_id'=>$nsu_id,
'course'=>$request->course[$item],
'section'=>$request->section[$item],
'class_start'=>$request->class_start[$item],
'class_end'=>$request->class_end[$item],
);
Course::insert($data);
}

最新更新