LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

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

ビュー側
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>
コントローラ側
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で動的に生成されていた場合は、
ビュー側
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>
コントローラ側
//  基本上記と同じ書き方でいけるかと。
// ただし、現状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();
}

もっと簡単にかける方法とかあればなと思いますが、参考までにー。
月別表示とか曜日+日付といった表示形式が違うリクエストが混ざって来ると、途端にうざくなります。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0