Laravel 5.6 コードスニペット集（複数配列編）

複数配列をリクエストとして受け取るときのサンプルコードあげときます。

##### ビュー側
```php:sample.blade.php
<div>
  <span class="badge badge-danger">必須</span>&nbsp;スケジュール
  @isset($month)
    @foreach($month as $index => $month)
      <div class="form-inline">
          <div class="form-check">
              {{-- 時間 --}}
              <label class="form-check-label text-sm-left text-nowrap" for="check-box_{{$index}}">
                  <input type="checkbox" name="check_flg[]" class="form-control"  id="check-box_{{$index}}" value="1">
                  {{'　'.$month['date'].'　'.$month['time_from'].' 〜 '.$month['time_to']}}
              </label>
              {{-- 納品数A --}}
              <label class="text-sm-left">&nbsp;納品数A:&nbsp;
                  <input type="number" name="product_1[]" min="0" style="width:25%;" value="{{ old('product_1', $company->product_1) }}" class="form-control">
              </label>
              {{-- 納品数B --}}
              <label class="text-sm-left">&nbsp;納品数B:&nbsp;
                  <input type="number" name="product_2[]" min="0" style="width:25%;"  value="{{ old('product_2', $company->product_2) }}" class="form-control">
              </label>

              <input type="hidden" name="schedule_id[]" value="{{$month['schedules_id']}}">
              <input type="hidden" name="schedule_date_day[]" value="{{$month['raw_date']}}">
              <input type="hidden" name="schedule_date_from[]" value="{{$month['time_from']}}">
              <input type="hidden" name="schedule_date_to[]" value="{{$month['time_to']}}">
          </div>
      </div>
    @endforeach
  @endisset
</div>
```
##### コントローラ側
```php:SampleController.php
// 編集画面
try{
  DB::beginTransaction();

    $schedule_id = $request->schedule_id;
    $schedule    = Schedule::with('person')->findorfail($schedule_id);
    $person      = $schedule->person;

    if(!empty($request->schedule_date_day) && !empty($request->schedule_date_from) && !empty($request->schedule_date_to)) {

      // データ
      $schedule->fill([
        'person_id'      => $request->person_id,
        'date_from'      => $request->date_day.' '.$request->date_from,
        'date_to'        => $request->date_day.' '.$request->date_to,
        'product_1'      => $request->product_1,
        'product_2'      => $request->product_2,
        'remarks'        => $request->remarks,
      ])->save();
    }
  DB::commit(); // end of transaction
  return redirect("/schedule")->withStatus("更新しました");

} catch(Exception $e) {
  Log::error($e);
  DB::rollBack();
  return back()->withInput();
}

// 新規登録画面
try{
  DB::beginTransaction();

    $inputs      = $request->all();

    if(!empty($inputs['check_flg_1']) && in_array('1', $inputs['check_flg_1'])) {
      $last_key               = array_key_last($inputs['check_flg_1']);
      for($i = 0; $i <= $last_key; $i++) {
        $schedule  = new DeliverySchedule();
        // スケジュールデータ
        $schedule->fill([
          'company_id'    => $inputs['company_id'],
          'person_id'     => $inputs['person_id'],
          'date_from'     => $inputs['date_day'][$i].' '.$inputs['date_from'][$i],
          'date_to'       => $inputs['date_day'][$i].' '.$inputs['date_to'][$i],
          'product_1'     => $inputs['product_1'][$i],
          'product_2'     => $inputs['product_2'][$i],
          'remarks'       => $inputs['remarks']
        ])->save();
      }
    }

  DB::commit(); // end of transaction
  $path    = '/company';
  $message = 'ok'; 
  return redirect($path)->withStatus($message);

} catch(Exception $e) {
  Log::error($e);
  DB::rollBack();
  return back()->withInput();
}
```
##### 上記の日時箇所がもし、JSで動的に生成されていた場合は、
##### ビュー側
```php:sample.blade2.php

{{ $time_array = ['10:00', '11:00', '12:00', '13:00', '14:00', '15:00'] }} // とりあえず適当に時刻を作成
<form>
  <div id="clone-area" class="form-group row">
    <label class="col-sm-2 col-form-label text-sm-left text-nowrap">&nbsp;スケジュール</label>

    <div class="form-inline clone-unit  col-auto ml-auto" >
      {{-- 日付 --}}
      <input id="datetime" name="date_day[]" type="date" value="{{ old('date_day') }}" class="form-control clone-form">
      &nbsp;&nbsp;&nbsp;
      {{-- 時刻 --}}
      <select class="text-sm-left  form-control clone-form" name="date_from[]">
        <option value=""></option>
        @foreach ($time_array as $val)
          <option value="{{ $val }}" {{ $val === old("date_from") ? "selected" : '' }}>
            {{ $val }}
          </option>
        @endforeach
      </select>
      &nbsp;&nbsp;&nbsp;～&nbsp;&nbsp;&nbsp;
      <select class="text-sm-left  form-control clone-form" name="date_to[]">
        <option value=""></option>
        @foreach ($time_array as $val)
          <option value="{{ $val }}" {{ $val === old("date_to") ? "selected" : '' }}>
            {{ $val }}
          </option>
        @endforeach
      </select>
      &nbsp;&nbsp;
      <div class="text-sm-left ">
        {{-- 納品数A --}}
        納品数A:&nbsp;
        <input type="number" name="product_1[]" min="0" style="width:15%;" value="{{ old('product_1', $company_data->product_1) }}" class="form-control">

        {{-- 納品数B --}}
        納品数B:&nbsp;
        <input type="number" name="product_2[]" min="0" style="width:15%;"  value="{{ old('product_2', $company_data->product_2) }}" class="form-control">

        <input class="check_flg_2 form-control clone-form" type="hidden" name="check_flg_2[]"  class="form-control">
        {{-- 要素増減ボタン --}}
        <div id="clone-minus" class="btn btn-danger">-</div>
        <div id="clone-plus" class="btn btn-primary">+</div>
      </div>
    </div>
  </div>
  <div class="form-group row mb-0 justify-content-center">
  <button type="button" class="btn btn-lg btn-primary mr-3">登録</button>
  </div>
</form>

<script>
// -------------------- スケジュール項目の複製 --------------------
// 追加数の指定
let minCount = 1;
let maxCount = 3;
// 追加
$(document).on("click", "#clone-plus", function(){
    let inputCount    = $("#clone-area .clone-unit").length;
    if(inputCount < maxCount) {
        let element   = $("#clone-area .clone-unit:last-child").clone(true);
        // 複製したタグの値をクリア
        let inputList = element[0].querySelectorAll('.clone-form');

        for(var i = 0; i < inputList.length; i++) {
                inputList[i].value = "";
        }
        $("#clone-area .clone-unit").parent().append(element); // 末尾追加
    }
});
// 削除
$(document).on("click", "#clone-minus", function() {
    let inputCount = $("#clone-area .clone-unit").length;
    if(inputCount > minCount) {
        $(this).closest(".clone-unit").remove();
    }
});

</script>
```
##### コントローラ側
```diff_php
//  基本上記と同じ書き方でいけるかと。
// ただし、現状1件～3件までのスケジュールが動的に保存されることを踏まえて、編集画面だけ保存前に現行データの削除処理を足す必要があります。
// 登録時はcreate()を使うべきとか、laravelのメソッドの作法的なことはまだ慣れてないので、すまそ。

// 編集画面
try{
  DB::beginTransaction();

    $schedule_id = $request->schedule_id;
    $schedule    = Schedule::with('person')->findorfail($schedule_id);
    $person      = $schedule->person;

    if(!empty($request->schedule_date_day) && !empty($request->schedule_date_from) && !empty($request->schedule_date_to)) {
      + // idに紐付のレコードを1件削除
      + $delivery_schedule->delete();

      $schedule->fill([
        'person_id'      => $request->person_id,
        'date_from'      => $request->date_day.' '.$request->date_from,
        'date_to'        => $request->date_day.' '.$request->date_to,
        'product_1'      => $request->product_1,
        'product_2'      => $request->product_2,
        'remarks'        => $request->remarks,
      ])->save();
    }
  DB::commit(); // end of transaction
  return redirect("/schedule")->withStatus("更新しました");

} catch(Exception $e) {
  Log::error($e);
  DB::rollBack();
  return back()->withInput();
}

// 新規登録画面
try{
  DB::beginTransaction();

    $inputs      = $request->all();

    if(count(array_filter($inputs['date_day'])) !== 0 && count(array_filter($inputs['date_day'])) !== 0 && count(array_filter($inputs['date_day'])) !== 0) { // 今回、チェックボックスにしなかったので、値判定方法が変わっていることに注意
      $last_key               = array_key_last($inputs['date_day']);

      for($i = 0; $i <= $last_key; $i++) {
        $schedule  = new DeliverySchedule();

        $schedule->fill([
          'company_id' => $inputs['company_id'],
          'person_id'  => $inputs['person_id'],
          'date_from'  => $inputs['date_day'][$i].' '.$inputs['date_from'][$i],
          'date_to'    => $inputs['date_day'][$i].' '.$inputs['date_to'][$i],
          'product_1'  => $inputs['product_1'][$i],
          'product_2'  => $inputs['product_2'][$i],
          'remarks'    => $inputs['remarks']
        ])->save();
      }
    }

  DB::commit(); // end of transaction
  $path    = '/company';
  $message = 'ok'; 
  return redirect($path)->withStatus($message);

} catch(Exception $e) {
  Log::error($e);
  DB::rollBack();
  return back()->withInput();
}
```
もっと簡単にかける方法とかあればなと思いますが、参考までにー。
月別表示とか曜日＋日付といった表示形式が違うリクエストが混ざって来ると、途端にうざくなります。

##### 参考
https://qiita.com/horikeso/items/d000f765dfbf60c6a6a2