複数配列をリクエストとして受け取るときのサンプルコードあげときます。
ビュー側
sample.blade.php
<div>
<span class="badge badge-danger">必須</span> スケジュール
@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"> 納品数A:
<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"> 納品数B:
<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"> スケジュール</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">
{{-- 時刻 --}}
<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>
~
<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>
<div class="text-sm-left ">
{{-- 納品数A --}}
納品数A:
<input type="number" name="product_1[]" min="0" style="width:15%;" value="{{ old('product_1', $company_data->product_1) }}" class="form-control">
{{-- 納品数B --}}
納品数B:
<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();
}
もっと簡単にかける方法とかあればなと思いますが、参考までにー。
月別表示とか曜日+日付といった表示形式が違うリクエストが混ざって来ると、途端にうざくなります。
参考