[Laravel]初期データを登録する方法(Seederを使う)

Laravel Laravel

アプリケーションを開発している時に、ほぼ必ずといっていいほどデータベースに初期データを登録する方法について解説します。
確認はLaravel10で行っておりますが、Laravel8や9でも同様に行って開発をしていましたので、手順やコマンドは変わらないと思います。

LaravelのSeeder(シーダー)とは

LaravelのSeederとは、データベースに初期データを登録する際に利用します。
最初から用意しておきたいマスターデータやテスト用のデータを作成するときに使えます。

SQLのINSERT文を記載したものを用意して実行するのも一つのやり方ですが、プログラムを利用した方がforループを利用したり、csvから読み込んだりできるし、パスワードのハッシュ化もできるので、積極的に利用した方が良さそうです。

Seederを作成して登録データを作成する

Seederを作成した後に、登録するデータを記載していきます。
Seederの作成にはartisanを利用して行います。

Seederを作成する

今回は例としてユーザーテーブルを作成します。

php artisan make:seeder UserSeeder
Bash

Seederのファイルはdatabase/seeders配下に配置されます。
作成されたファイルは以下のようになっています。

database/seeders/UserSeeder.php
<?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
    {
        //
    }
}
PHP

runメソッドがSeederを実行したときに処理されるメソッドです。
ここに登録処理を書いていきます。

Seederに登録データを記述する

Modelはまだ作成していないものとして記載しています。

database/seeders/UserSeeder.php
<?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'),
        ]);
    }
}
PHP

Model作成済みの場合

あまり変わらないですが、Modelがあるならばこちらの方が良いかもしれません。

database/seeders/UserSeeder.php
<?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メソッドの引数の配列に追加していきます。

database/seeders/DatabaseSeeder.php
<?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,
        ]);
    }
}
PHP

Seederを実行する

以下のコマンドで実際のテーブルにデータが作成されます。

php artisan db:seed
Bash

Seederを指定して実行する

--classで作成したSeederを指定することもできます。
指定した場合はdatabase/seeders/DatabaseSeeder.phpに登録していなくても実行できます。

php artisan db:seed --class UserSeeder
Bash

Migrateと同時にSeederも実行する

テーブル作成をするマイグレーションと同時に初期データを入れたい場合は以下のコマンドで作成できます。

php artisan migrate --seed
Bash

【Laravel】artisanのmigrateコマンドを解説

アプリケーション作成初期時には、データを壊してしまったりして、DBをリセットしたりすることが多いと思います。
その際に、マイグレーションファイルと共にSeederも用意しておけば、何度でもやり直しができます。
私も良く利用するコマンドなので紹介します。

php artisan migrate:refresh --seed
Bash

【Laravel】artisanのmigrate:refreshコマンドを解説

まとめ

初期データを登録できるSeederを紹介しました。
開発をスタートする際には面倒でもマイグレーションファイルとSeederを用意しておけば、開発が楽になります。
また、テスト用のデータのSeederも用意しておけば、テストも楽になると思います。

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました