UnsplashのLink Hoangが撮影した写真
目次
開発時に必須のダミーデータを手軽に作成する機能、「シーダー」と「ファクトリー」。
このページは、この2つの機能の基本的な使い方をまとめたページです。
Seederの基本として、任意のダミーデータを作成する例です。
例で使用するDBは以下です。
テーブル名:messages
カラム1:title
カラム2:content
コマンドラインで以下のコマンドを実行します。
$ php artisan make:seeder [シーダーファイル名]
例)$ php artisan make:seeder MessagesTableSeeder
上記コマンドを実行すると、以下の場所にファイルが作成されます。
シーダーファイル作成先 :/database/seeders/~.php
シーダーファイルで、作成するダミーデータを定義します。
「/database/seeders/~.php」として作成されたシーダーファイルを編集します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
// 追加するとseederを利用したデータ生成が可能
use Illuminate\Support\Facades\DB;
class MessagesTableSeeder extends Seeder
{
public function run(): void
{
// 基本の書き方 ////////////////////////
// DB::table('テーブル名')->insert([
// 'カラム名1' => '値1',
// 'カラム名2' => '値2'
// ]);
// 書き方の例⓵1データずつ記述 ////////
DB::table('messages')->insert([
'title' => 'test title 1',
'content' => 'test content 1'
]);
// 書き方の例⓶:ループでデータ作成 ////////
for($i = 1; $i <= 100; $i++){
DB::table('messages')->insert([
'title' => 'test title ' . $i,
'content' => 'test content ' . $i
]);
}
}
}
シーダーは個別に実行することもできますが、
複数のシーダーファイルがある場合、DatabaseSeeder.phpで呼び出しておくと一括でシーディングできて便利です。
今回の例でもDatabaseSeeder.phpを使います。
「/database/seeders/DatabaseSeeder.php」を編集します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([MessagesTableSeeder::class]);
}
}
コマンドプロンプトで以下コマンドを実行するとダミーデータが作成されます。
$ php artisan db:seed
※DabaseSeeder.phpで指定したシーダ全て実行
■補足:個別にシーダーファイルを実行する
$ php artisan db:seed --class=MessagesTableSeeder
■全マイグレーションをやり直し、シーディングする
以下は、DB内の全てのデータを一度削除し、シーディングをやり直すコマンドです。(すごく便利!)
$ php artisan migrate:refresh --seed
例で使用するDBは以下です。
テーブル名:messages
カラム1:title
カラム2:content
$ php artisan make:factory [モデル名]
例)$ php artisan make:factory Message
※ファイル作成先:/database/factories/MessageFactory.php
Factoryファイルではダミーデータとしてどのようなデータを作成するかを定義します。
対象ファイル:/databases/factories/MessageFactory.php
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Message; // 追記
class MessageFactory extends Factory
{
// definition()の処理全体の追記が必要
public function definition()
{
$title = ['初投稿', 'title1', 'title2'];
$content = ['はじめまして', ‘content1', 'content2'];
$title = $title[rand(0, count($title) - 1)]
$content = $content[rand(0, count($content) - 1)];
return [
'title' => $title,
'content' => $content,
];
}
}
この例では、$title、$contentの各配列の値をランダムに組み合わせたデータが作成されます。
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Message; //追記
class DatabaseSeeder extends Seeder
{
public function run()
{
// 追記 以下では5件のダミーデータを作成する
Message::factory()->count(5)->create();
//↑件数
}
}
以下コマンドにてシーディングできます。
$ php artisan db:seed
※全マイグレーションをやり直し、シーディングするコマンド
php artisan migrate:refresh –seed
ランダムなデータを作成したい場合に便利なのがFakerです。
Faker使う場合は「Seederの使い方②Factory使用」の流れで作業し、「手順2」の代わりに以下を実施するだけです。
■/config/app.phpを一部編集
app.phpの以下1行を編集します。
'faker_locale' => 'ja_JP'
■Factoryファイルを編集する
対象ファイル:/databases/factories/MessageFactory.php
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Message; // 追記
class MessageFactory extends Factory
{
// definition()の処理全体の追記が必要
public function definition()
{
return [
'content' => $this->faker->realText(100), // ランダムな100文字
'title' => $this->faker->realText(10), // ランダムな10文字
];
}
}
Fackerの使い方は以上です。
■Fakerで設定できる値
参考ページ:https://github.com/fzaninotto/Faker?tab=readme-ov-file#fakerproviderfile
ランダムな数字
$this->faker->numberBetween(値の範囲);
例)$this->faker->numberBetween(1, 100);
ランダムなテキスト
$this->faker->realText(文字数);
例)$this->faker->realText(100);
名前
$this->faker->lastKanaName;
$this->faker->firstKanaName;
ユーザID
$this->faker->userName
電話番号
$this->faker->phoneNumber
会社名
$this->faker->company
郵便番号
$this->faker->postcode
住所
$this->faker->address
都道府県
$this->faker->prefecture
市町村
$this->faker->city
町、番地
$this->faker->streetAddress
建物名、部屋番号
$this->faker->secondaryAddress
シーディング、ファクトリーに関しては以上です。