アプリケーションを開発している時に、ほぼ必ずといっていいほどデータベースに初期データを登録する方法について解説します。
確認はLaravel10で行っておりますが、Laravel8や9でも同様に行って開発をしていましたので、手順やコマンドは変わらないと思います。
LaravelのSeeder(シーダー)とは
LaravelのSeederとは、データベースに初期データを登録する際に利用します。
最初から用意しておきたいマスターデータやテスト用のデータを作成するときに使えます。
SQLのINSERT文を記載したものを用意して実行するのも一つのやり方ですが、プログラムを利用した方がforループを利用したり、csvから読み込んだりできるし、パスワードのハッシュ化もできるので、積極的に利用した方が良さそうです。
Seederを作成して登録データを作成する
Seederを作成した後に、登録するデータを記載していきます。
Seederの作成にはartisanを利用して行います。
Seederを作成する
今回は例としてユーザーテーブルを作成します。
php artisan make:seeder UserSeeder
BashSeederのファイルはdatabase/seeders
配下に配置されます。
作成されたファイルは以下のようになっています。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
//
}
}
PHPrun
メソッドがSeederを実行したときに処理されるメソッドです。
ここに登録処理を書いていきます。
Seederに登録データを記述する
Modelはまだ作成していないものとして記載しています。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
PHPModel作成済みの場合
あまり変わらないですが、Modelがあるならばこちらの方が良いかもしれません。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use App\Models\User;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*/
public function run(): void
{
User::create([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
PHPテスト用などでランダムな値を入れたい
上記の例のように、ランダムな名前やメールアドレスを入れたい場合は、FactoryとFakerを利用すると楽に登録ができるようになります。
これに関しては別の記事で紹介したいと思います。
DatabaseSeederを編集する
作成したSeederファイルは、database/seeders/DatabaseSeeder.php
から呼び出すようにして使用します。
今回は1ファイルだけですが、複数ファイルの場合はcallメソッドの引数の配列に追加していきます。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}
PHPSeederを実行する
以下のコマンドで実際のテーブルにデータが作成されます。
php artisan db:seed
BashSeederを指定して実行する
--classで作成したSeederを指定することもできます。
指定した場合はdatabase/seeders/DatabaseSeeder.php
に登録していなくても実行できます。
php artisan db:seed --class UserSeeder
BashMigrateと同時にSeederも実行する
テーブル作成をするマイグレーションと同時に初期データを入れたい場合は以下のコマンドで作成できます。
php artisan migrate --seed
Bash【Laravel】artisanのmigrateコマンドを解説
アプリケーション作成初期時には、データを壊してしまったりして、DBをリセットしたりすることが多いと思います。
その際に、マイグレーションファイルと共にSeederも用意しておけば、何度でもやり直しができます。
私も良く利用するコマンドなので紹介します。
php artisan migrate:refresh --seed
Bash【Laravel】artisanのmigrate:refreshコマンドを解説
まとめ
初期データを登録できるSeederを紹介しました。
開発をスタートする際には面倒でもマイグレーションファイルとSeederを用意しておけば、開発が楽になります。
また、テスト用のデータのSeederも用意しておけば、テストも楽になると思います。
コメント