今まで以下の方法でテーブルのID最大値を取得してました
$maxId = Users::max('id') + 1;
もしくは
$maxId = DB::table('users')
->select('id')
->oredrby('id', 'desc')
->first()->id;
前者はテーブルのレコード数が大量になると遅くなるので、データが大量になる場合は後者を使ってました。
が、エラーなど起こってデータがロールバックされた場合抜け番が生じます。
その結果、子テーブルがある場合データの不整合が起きます。
どういう事かというと
なので、以下のクエリでauto increment値を取得
SELECT
AUTO_INCREMENT
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = 'DB名'
AND TABLE_NAME = 'テーブル名'
;
Laravelであれば
$maxId = DB::table("INFORMATION_SCHEMA.TABLES")
->select("AUTO_INCREMENT")
->where("TABLE_SCHEMA", "DB名")
->where("TABLE_NAME", "テーブル名")
->first()->AUTO_INCREMENT;
これで子テーブルでもauto increment値が登録可能です