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

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

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

**id, 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();
    });
}
这就是我对控制器所做的,我得到了数组到字符串转换异常

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