Laravelでリレーションしてる親子関係(1対多)の複数テーブルに同時にデータを登録する方法をご紹介します。(Laravelバージョン6系)
(親)部署:departmentsテーブルデータ登録時に親テーブルのidを取得し、そのidを使用しfor文とsave()を使って(子)所属社員:employeesテーブルにデータを登録します。
親子関係(1対多)の2つのテーブル構造
親子関係(1対多)の2つのテーブルを用意しました。部署(departmentsテーブル)に所属する複数の社員(employeesテーブル)を登録するテーブル構造です。
部署テーブル:departmentsテーブル(親)
| 名前 | 説明 | 
|---|---|
| id | 主キー | 
| department_name | 部署名 | 
所属社員テーブル:employeesテーブル(子)
| 名前 | 説明 | 
|---|---|
| id | 主キー | 
| employee_name | 社員名 | 
| department_id | 部署ID=departmentsテーブルのid ※departmentsテーブルのテーブル名から「s」を除いた名前「department」とdepartmentsテーブルの主キー「id」にアンダーバー「_」を付けた名前「department_id」にする必要があります。こうすることでdepartmentsテーブルからidが一致したデータを取得することができます。  | 
親と子のテーブルデータ用のModelを用意
※Departmentモデル、Employeeモデルを用意します。
departmentsテーブル(親)のテーブルデータ用Modelの記述
※Department.phpファイルを用意します。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Department extends Model
{
}
employeesテーブル(親)のテーブルデータ用Modelの記述
※Employee.phpファイルを用意します。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Employee extends Model
{
}
部署、所属社員の登録フォーム(登録ページ)のviewの記述
※departmentsregister.blade.phpファイルを用意します。1部署に最大5名の社員まで登録できるフォームです。
        @if (session('message'))
            <div class="message">
                {{ session('message') }}
            </div>
        @endif
@include('common.errors')
<form enctype="multipart/form-data" action="{{ url('departmentsentry') }}" method="POST">
@csrf
<div>
	<label for="department_name">部署名※</label>
	<input type="text" id="department_name" name="department_name" value="{{ old('department_name') }}">
</div>
<ul>
	<li>
	<label for="employee_name[0]">所属社員名1</label>
	<input type="text" id="employee_name[0]" name="employee_name[0]" value="{{ old('employee_name[0]') }}">
	</li>
	<li>
	<label for="employee_name
">所属社員名2</label>
	<input type="text" id="employee_name
" name="employee_name
" value="{{ old('employee_name
') }}">
	</li>
	<li>
	<label for="employee_name
">所属社員名3</label>
	<input type="text" id="employee_name
" name="employee_name
" value="{{ old('employee_name
') }}">
	</li>
	<li>
	<label for="employee_name
">所属社員名4</label>
	<input type="text" id="employee_name
" name="employee_name
" value="{{ old('employee_name
') }}">
	</li>
	<li>
	<label for="employee_name
">所属社員名5</label>
	<input type="text" id="employee_name
" name="employee_name
" value="{{ old('employee_name
') }}">
	</li>
</ul>
<button type="submit" class="btn-entry">登録</button>
</form>
Routeの記述
※ページURLは必要に応じて変更して下さい。
//登録画面
Route::get('/departmentsregister','DepartmentsController@register');
//登録処理
Route::post('/departmentsentry','DepartmentsController@entry');
親子関係(1対多)の複数テーブルに同時にデータを登録するControllerの記述
※(親)部署:departmentsテーブルデータ登録時に親テーブルのidを取得し、そのidを使用しfor文とsave()を使って(子)所属社員:employeesテーブルにデータを登録する、DepartmentsController.phpファイルを用意します。
Department、Employeeモデルの読込
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Department;   //Departmentモデルを使用
use App\Employee;   //Employeeモデルを使用
use Validator;  //バリデーションを使用
use DB;
登録画面と登録処理の記述
※登録画面の表示「register(Request $request)~」と登録処理「entry(Request $request)~」の記述です。登録処理では入力後「//バリデーションチェック」を行い、「部署テーブル:departmentsテーブル(親)に登録」を行った後「//departmentsテーブル(親)に登録したidを取得」し、「//所属社員名1~5を配列で取得」後、for文内で「//所属社員テーブル:employeesテーブル(子)に登録」を「//所属社員名が入力されている場合のみ登録」を行います。
class DepartmentsController extends Controller{
    //登録画面
    public function register(Request $request)
    {
        return view('departmentsregister', [
        ]);
    }
    //登録処理
    public function entry(Request $request) {
        //バリデーションチェック
        $validator = Validator::make($request->all(), [
            'department_name' => 'required',
            'department_name' => 'max:255',
        ]);
        //バリデーション:エラー 
        if ($validator->fails()) {
                return redirect('/departmentsregister')
                    ->withInput()
                    ->withErrors($validator);
        }
        //部署テーブル:departmentsテーブル(親)に登録
        $departments = new Department;
        $departments->department_name = $request->department_name;
        $departments->save();
	//departmentsテーブル(親)に登録したidを取得
        $department_id = $departments->id;
	//所属社員名1~5を配列で取得
        $employee_names = $request->get('employee_name');
        //所属社員テーブル:employeesテーブル(子)に登録
        for($i=0; $i<5; $i++){
            //所属社員名が入力されている場合のみ登録
            if($employee_names[$i] != "" && !empty($employee_names[$i])){
                $employee = New Employee;
                $employee->department_id = $department_id;	//departmentsテーブル(親)に登録したidを登録
                $employee->employee_names = $employee_names[$i];
                $employee->save();
            }
        }
        return redirect('/departmentsregister')->with('message', 'データを登録しました');
    }
}
 
 
※流用される場合は自己責任でお願いします。