はじめに
Seederで作成したテストデータを消去して「php artisan migrate:fresh --seed」もう一度作成すると、
レコードの主キーのidが「5」からスタートしていました。
自分としては作り直しても主キーを0からスタートする方法を探していたので、対処法をまとめます。
結論としては、任意のSeederクラス内に「DB:statement()」を追記することで、オートインクリメント値をリセットできます。
環境
Laravel 9.52.16
問題
- Seederでテストデータを作成したい
- 作り直すごとに自動インクリメントのidが1からスタートするようにしたい
自動インクリメントはMySQLなどのデータベースシステムで使用される特性で、
主キーのフィールドに値を自動的に生成して割り当てます。
例えば主キーが「id」カラムの時、MySQLはこちらが指示を出さずとも自動的に1から順番の値を割り当ててくれます。
しかしテーブルデータを一旦削除し、新しくSeederでデータを挿入しようとすると、主キーが途中の数字から割り当てられてしまいます。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CategoriesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// categoriesテーブルのデータを一旦削除する
DB::table('categories')->delete();
// categoriesテーブルのテストデータを作成
$categories = ['ゲーム', '料理', 'スポーツ', '音楽', 'その他'];
foreach ($categories as $category) {
DB::table('categories')->insert([
'category' => $category,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
root:/var/www/html/niches# php artisan migrate:fresh --seed
root:/var/www/html/niches# php artisan tinker
Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Psy Shell v0.11.22 (PHP 8.2.7 — cli) by Justin Hileman
> use Category
> Category::all();
[!] Aliasing 'Category' to 'App\Models\Category' for this Tinker session.
= Illuminate\Database\Eloquent\Collection {#7248
all: [
App\Models\Category {#7250
id: 6,
category: "ゲーム",
},
App\Models\Category {#7251
id: 7,
category: "料理",
},
App\Models\Category {#7252
id: 8,
category: "スポーツ",
},
App\Models\Category {#7253
id: 9,
category: "音楽",
},
App\Models\Category {#7254
id: 10,
category: "その他",
},
],
}
解決法
- 「DB:statement」でオートインクリメント値をリセットするSQL文を使う
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CategoriesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('categories')->delete();
// categoriesテーブルのオートインクリメント値をリセット
DB::statement('ALTER TABLE categories AUTO_INCREMENT = 1');
$categories = ['ゲーム', '料理', 'スポーツ', '音楽', 'その他'];
foreach ($categories as $category) {
DB::table('categories')->insert([
'category' => $category,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
LaravelのDB:statementメソッドを使い、生のSQL文を実行します。
具体的には、「categoriesテーブルのAUTO_INCREMENT値を1にリセットする」SQL文を実行しています。
これにより、Seederを実行して再度データを生成する際、
AUTO_INCREMENT値が1からスタートするようになりました。
root:/var/www/html/niches# php artisan migrate:fresh --seed
root:/var/www/html/niches# php artisan tinker
Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Psy Shell v0.11.22 (PHP 8.2.7 — cli) by Justin Hileman
> use Category
> Category::all();
[!] Aliasing 'Category' to 'App\Models\Category' for this Tinker session.
= Illuminate\Database\Eloquent\Collection {#7248
all: [
App\Models\Category {#7250
id: 1,
category: "ゲーム",
},
App\Models\Category {#7251
id: 2,
category: "料理",
},
App\Models\Category {#7252
id: 3,
category: "スポーツ",
},
App\Models\Category {#7253
id: 4,
category: "音楽",
},
App\Models\Category {#7254
id: 5,
category: "その他",
},
],
}
ちゃんと主キーのidが1からスタートしていることが確認できますね!