【问题标题】:How to store Multidimensional array in Database - using laravel 5.8如何在数据库中存储多维数组 - 使用 laravel 5.8
【发布时间】:2020-07-12 16:14:45
【问题描述】:

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

**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:插入coursesclass_endclass_startcoursensu_idsection)值(9:30 , 08:00 AM, cse 115, 1520836042, 1))

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

【问题讨论】:

    标签: php mysql database laravel


    【解决方案1】:

    我建议研究 Laravel 的 Eloquent ORM。来自Eloquent documentation

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

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

    或者如果您配置为允许mass assignment

    Course::create($request);
    

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

    编辑 1

    根据 cmets,您不想尝试追求 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 字符串通过 json_encode()

    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

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

    向数据库中插入多行

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

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

    【讨论】:

    • 我之前尝试过这种方式,甚至我已经多次研究过 Laravel 的 Eloquent ORM。但最后,我遇到了这个错误。我认为问题在于以逻辑方式将多维数组传递到数据库表中。
    • 您可能会遇到更深层次的架构问题。您可能想考虑一下为什么要尝试以这种方式为多门课程添加信息。在尝试将多个课程与用户关联时,数据透视表可以提供更大的灵活性。在这种情况下,我仍然建议使用 Eloquent 模型,并利用您可以在那里定义的关系。
    • 我在我的问题中包含了模型和迁移。请检查。顺便说一句,我试过这个查询:** $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_start']; $content->class_end=$data['class_end']; $内容->保存(); }**
    • 首先,我是 Laravel 的新手,还在学习最好的逻辑方式。我尽力使用 Eloquent 模型和它的关系。你能帮我给我一个合乎逻辑的方式吗?提前致谢。
    • 我通过编辑添加了一些信息到关于将数组转换为字符串的答案。由于您的架构需要这些列的字符串,因此可以解决此问题。同时,我建议阅读或观看更多关于 Eloquent 关系的教程。
    【解决方案2】:

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

    foreach $data as $data

    并且,将$courseData 留空并让其插入。

    固定版本:

    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 值也是一个数组,你必须重新考虑表单的输入名称,并重构你的数据以获得更简单和更可用的逻辑表单。

    【讨论】:

    • 非常感谢您的回答。首先,我是 Laravel 的新手,还在学习。我从谷歌那里得到了帮助来解决这个特定的问题。是的,我的代码仍然无法正常工作。为了您的关注,我做了几种方法来解决这个问题,包括不为表单中的输入名称采用数组,忽略控制器中的 foreach 循环。但最后,我遇到了这个错误。你能帮我给我一个合乎逻辑的方法吗?提前致谢。
    【解决方案3】:

    花了很多时间后,我成功地以不同的方式解决了我自己的问题。感谢@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);
                }
    

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 2011-09-12
      • 2021-01-14
      • 2016-07-29
      • 1970-01-01
      • 2016-06-14
      • 2021-03-12
      • 1970-01-01
      相关资源
      最近更新 更多