Как сохранить многомерный массив в базе данных - используя laravel 5.8 - PullRequest
1 голос
/ 01 апреля 2020

Я хочу сохранить информацию о курсах студентов в таблице курсов базы данных. Студент может добавить несколько курсов, классов и секций одновременно, используя форму. Вот подробности курсов таблицы:

**id, 
nsu_id
course,
section,
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();
    });
}

Это то, что я сделал с контроллером, и я получаю Исключение преобразования массива в строку .


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

Когда я пытаюсь получить значение с помощью вспомогательной функции 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"
      ]
    ]

Ошибка: Преобразование массива в строку ( SQL: вставить в значения courses (class_end, class_start, course, nsu_id, section) (9:30, 08:00, cse 115, 1520836042, 1))

Любая помощь будет высоко оценена

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Я бы порекомендовал заглянуть в 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);

Кроме того, вы должны взглянуть на Проверка на этот входящий запрос, чтобы убедиться, что ваши пользователи не делают ошибок, или какой-то плохой актер не пытается скомпрометировать ваше приложение.

РЕДАКТИРОВАТЬ 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 Строка с помощью 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

В комментариях вы спросили, как сделать множественные вставки

Вставка нескольких строк в базу данных

Взгляните на Laravel Документация по вставке БД , но вот пример с этой страницы:

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);
0 голосов
/ 02 апреля 2020

Через много времени я успешно решаю свою собственную проблему другим способом. Спасибо @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);
            }
0 голосов
/ 01 апреля 2020

Прежде всего, 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 методу пустого массива в качестве входных данных вместо строки.

После исправления этой проблемы вы поймете, что ваш код все еще не работает, потому что ваши значения записей также являются массивом, вы необходимо еще раз подумать о вводимых именах вашей формы и восстановлении ваших данных для более простой и удобной логической формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...