Php 如何在数据库中存储多维数组-使用laravel 5.8
我想将学生的课程信息保存到数据库课程表中。学生可以使用表单一次添加多个课程、课时和部分。以下是课程的详细信息表: **id, nsu_id course, section, class_start, class_end** 迁移Php 如何在数据库中存储多维数组-使用laravel 5.8,php,mysql,database,laravel,Php,Mysql,Database,Laravel,我想将学生的课程信息保存到数据库课程表中。学生可以使用表单一次添加多个课程、课时和部分。以下是课程的详细信息表: **id, nsu_id course, section, class_start, class_end** 迁移 public function up() { Schema::create('courses', function (Blueprint $table) { $table->increments('id'); $table
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();
});
}
这就是我对控制器所做的,我得到了数组到字符串转换异常
public function store(Request $request)
{
$data[]=$request->all();
//dd($data);
$courseData=[];
foreach($data as $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');
}
公共函数存储(请求$Request)
{
$data[]=$request->all();
//dd(数据);
$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);
返回redirect()->到('/home');
}
当我尝试使用helper函数dd($data)获取值时强>
array:1 [▼
0 => array:6 [▼
"_token" => "2AspZiawULQy4fMikkBTRzjvUxPVnZPPonJrZAUy"
"course" => array:2 [▼
0 => "cse 115"
1 => "cse 215"
]
"section" => array:2 [▼
0 => "1"
1 => "2"
]
"class_start" => array:2 [▼
0 => "08:00 AM"
1 => "09:40 AM"
]
"class_end" => array:2 [▼
0 => "9:30"
1 => "11:10"
]
"nsu_id" => "1520836042"
]
]
阵列:1[▼
0=>数组:6[▼
“_token”=>“2AspZiawULQy4fMikkBTRzjvUxPVnZPPonJrZAUy”
“课程”=>数组:2[▼
0=>“cse 115”
1=>“cse 215”
]
“节”=>数组:2[▼
0 => "1"
1 => "2"
]
“类_开始”=>数组:2[▼
0=>“上午8:00”
1=>“上午9:40”
]
“class_end”=>数组:2[▼
0 => "9:30"
1 => "11:10"
]
“nsu_id”=>“1520836042”
]
]
错误:数组到字符串的转换(SQL:插入课程
(课程结束
,课程开始
,课程
,nsu id
,部分
)值(上午9:30,08:00,cse 115,1520836042,1))
我们将非常感谢您的任何帮助首先,控制器中的foreach非常奇怪。为什么
foreach$data作为$data
然后,将$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值也是一个数组,您必须重新考虑表单的输入名称,并重新构建数据以获得更简单、更可用的逻辑表单 我建议研究一下拉雷维尔雄辩的ORM。从:
每个数据库表都有一个相应的“模型”,用于与该表进行交互。模型允许您查询表中的数据,以及向表中插入新记录
或者如果您配置为允许
另外,您应该查看传入的请求,以确保您的用户没有犯错误,或者某个坏角色没有试图压缩您的应用程序
编辑1
根据评论,你不想试图寻求雄辩的解决方案$数据['course'],是一个数组。由于模式中定义的数据库需要字符串,因此这将是一个问题。下面是关于如何将数组数据转换为字符串的一些想法
通过内爆()分隔的逗号(
通过JSON_encode()生成的JSON字符串
编辑2
在评论中,您询问了如何进行多个插入
在数据库中插入多行
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']),
];
}
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']),
];
}
看一看,下面是该页的示例:
DB::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
在花了很多时间之后,我成功地用另一种方式解决了自己的问题。感谢@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);
}
非常感谢你的回答。首先,我是拉雷维尔的新手,还在学习。我从谷歌那里得到了帮助来解决这个特定的问题。是的,我的代码仍然不起作用。出于您的考虑,我使用了几种方法来解决此问题,包括不将数组作为表单中的输入名称,忽略控制器中的foreach循环。但最后,我犯了这样的错误。你能帮我给我一个合乎逻辑的方法吗。提前谢谢。我以前试过这种方法,甚至我已经研究过拉雷维尔的雄辩ORM好几次了。但最后,我犯了这样的错误。我认为问题在于以逻辑的方式将多维数组传递到数据库表中。您可能需要思考一下,为什么要尝试以这种方式为多个课程添加信息。当尝试将多个课程与用户关联时,数据透视表可以提供更大的灵活性。在这种情况下,我仍然建议使用雄辩的模型,并利用您可以在其中定义的关系。请查收。顺便说一句,我尝试了以下查询:*$courseData[]=$request->all();foreach($courseData as$data){$content=new Course();$content->nsu id=$data['nsu id'];$content->Course=$data['Course'];$content->section=$data['section'];$content->class_start=$data['class_end'];$content->save()}**首先,我是拉雷维尔的新手,仍然在学习最好的逻辑方法。我尽力使用雄辩的模型和它的关系。你能帮我给我一个逻辑方法吗。提前谢谢。我通过编辑在答案中添加了一些关于将数组转换为字符串的信息。因为您的模式需要这些列使用字符串,所以这可能是一个解决方法。同时,我建议大家阅读或观看更多关于雄辩关系的教程。
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']),
];
}
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']),
];
}
DB::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
$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);
}