0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】DBに直接データを入れてた私が「マイグレーション」と「Seeder」に出会った話②

Posted at

はじめに

この記事は、下記記事の続きです。

マイグレーションでテーブルを作成した後、実際にデータを入れるために Seeder(シーダー) を使う方法を紹介します。
マイグレーションがすでに理解できている方は、この記事だけ読んでも問題ありません。

Seeder

Seeder(シーダー) とは、
データベースに初期データやテスト用データを簡単に流し込むための仕組みです。

例えば、ユーザー情報を開発中に毎回手動でINSERTするのは面倒ですが
Seederを使えばコマンド1つでデータを投入できるため、開発効率が格段に上がります。

①テーブルの作成
php artisan make:seeder テーブル名TableSeeder

database/seeders/テーブル名TableSeeder.php というファイルが作成されます。

②作成されたファイルの中身を編集
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        //この中に追記します
    }
}

上記は初期状態のSeederファイルです。
run() メソッドの中に、実際に挿入するデータを記述していきます。

// (例)
public function run(): void
{
    DB::table('users')->insert([
        'name' => 'Taro',
        'email' => 'taro@example.com',
        'password' => Hash::make('123456789'),
    ]);
}
③Seederを実行

Seederファイルを作成しただけでは、まだデータは挿入されません。
コマンドを実行して初めてデータが流し込まれます。

php artisan db:seed --class=テーブル名TableSeeder

★手順①~②を複数作成した場合は下記コマンドで一度に全て実行することができます。
 一部実行したくないファイルがある場合はこちら

php artisan db:seed

さらに…
マイグレーションファイル・Seederファイルをまとめて実行することも可能です。

php artisan migrate --seed

データを追加・削除したい場合

開発が進むと「初期データを追加したい」「間違って入れたデータを消したい」といったケースがよく出てきます。
ここでは “ファイルを増やす” か “既存を編集する” かで考え方を分けます。

パターンA:新しい Seeder ファイルを追加する (基本はこちら)

手順①~③を追加で行うのみです。
作成済みの Seeder の内容は“履歴”として残し、新しい追加分は別ファイルにする方法です。
変更履歴が明確になり、チーム開発で衝突しにくいというメリットがあります。

パターンB:既存 Seeder に追記・修正する

既存ファイルのinsert部分に,[ ] を使用しそのまま追記してください。
ローカル開発でまだ他メンバーと共有していない段階で使用することをお勧めします。

// (例)
public function run(): void
{
    DB::table('users')->insert([
        'name' => 'Taro',
        'email' => 'taro@example.com',
        'password' => Hash::make('123456789'),
    ],
    // ★ 下記を追加
    [
        'name' => 'Jiro',
        'email' => 'jiro@example.com',
        'password' => Hash::make('123123123'),
    ],
}

ここで注意したい点は、Taroさんのデータは一度DBに登録済みであるため単純に実行するだけでは重複エラーが起こることです。

【解決策1】
下記コマンドで、登録されたデータは一度削除され、改めてデータが登録されます。

php artisan migrate:fresh --seed

【解決策2】
DB::table('users')->insert 部分を User::updateOrCreate に書き換えます。
データがあれば更新、なければ新規作成を行います。

// (例)
public function run(): void
{
    User::updateOrCreate(
        ['email' => 'taro@example.com'],
        ['name' => 'Taro', 'password' => Hash::make('password')]
    );

    User::updateOrCreate(
        ['email' => 'jiro@example.com'],
        ['name' => 'Jiro', 'password' => Hash::make('password')]
    );
}

特定のSeederのみ流したい/流したくない場合(一括設定)

新規プロジェクトにデフォルトで作られている DatabaseSeeder.phpファイル。
複数の Seeder を一度に実行したいときに便利です。
プロジェクトに存在しない場合は下記コマンドで作成できます。

php artisan make:seeder DatabaseSeeder

実行したくないファイルはコメントアウト、もしくは記述を削除してください。

// (例)
namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UsersTableSeeder::class,
            BusinessesUsersSeeder::class,
            // PostsTableSeeder::class,
        ]);
    }
}

下記コマンドにて、コメントアウトされたデータ以外が実行されます。

php artisan db:seed

さいごに

本記事ではSeederについて詳しく解説しました。
実務では今回記述した基本的な使い方のみで問題なく進めることができています。
さらに高度な使い方もあるようですが、今後使用する機会があった際に備忘録として追記したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?