シーディング

記事の内容

概要

シーディングは、データベースに初期データを自動で挿入するための仕組みです。

コマンド

【実行内容】

php artisan make:seeder シーディング名

シーダー定義

<?php

namespace Database\Seeders;

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

class SampleSeeder extends Seeder
{
    public function run()
    {
        // DBファサードを使用してデータを挿入
        DB::table('テーブル名')->insert([
            'カラム名' => 'データ',
        ]);
    }
}

データ投入

【実行内容】

php artisan db:seed --class=シーダー名

シーダー作成

【実行内容】

// シーディング名を指定
php artisan make:seeder UsersTableSeeder

シーダー設定

作成されたシーダークラスに、挿入するデータを記述します。

【ファイル先】database/seeders/UsersTableSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // テーブルを空にする
        User::truncate();

        // 10人分の仮データを挿入
        for ($i = 0; $i < 10; $i++) {
            User::create([
                'name' => Str::random(10),
                'email' => Str::random(10).'@example.com',
                'password' => Hash::make('password'),
            ]);
        }
    }
}

シーダーを呼び出す

【ファイル先】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(UsersTableSeeder::class);
    }
}

コマンドを実行

【実行内容】

php artisan db:seed

一覧

特定実行

【実行内容】

php artisan db:seed --class=特定のシーダー名

強制的に実行

本番環境などでシーダーを強制的に実行する場合に使用します。

【実行内容】

php artisan db:seed --force

データベース指定

デフォルトのデータベース接続以外を使用してシーダーを実行したい場合に使用します。
※connectionsを指定

【実行内容】

php artisan db:seed --database=sqlite

【ファイル先】config/database.php

return [

    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        // 他の接続設定...

    ],

    // 他の設定...
];

対話なし

シーディング中に対話的な入力をスキップしたい場合に使用します。

【実行内容】

php artisan db:seed --no-interaction
記事の内容
閉じる