記事の内容
概要
ファクトリは、テストや開発中に大量のデータを簡単に生成するための仕組みです。
ファイル作成
【実行内容】
// ファクトリー名を指定
php artisan make:factory UserFactory
設定変更
ファクトリで生成する際にランダムなデータを使って各フィールドに初期値を設定します。
【ファイル先】database/factories/UserFactory.php
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* The current password being used by the factory.
*/
protected static ?string $password;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => static::$password ??= Hash::make('password'),
'remember_token' => Str::random(10),
];
}
/**
* 未確認ユーザーの状態を定義
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
作成件数を設定
【ファイル先】database/seeders/DatabaseSeeder.php
use Illuminate\Database\Seeder;
use App\Models\User;
class DatabaseSeeder extends Seeder
{
/**
* シードの実行
*
* @return void
*/
public function run()
{
// definitionに基づくユーザーを10件生成
User::factory()->count(10)->create();
}
}
シーダー実行
ファクトリで生成されたシーダーデータが作成されます。
【実行内容】
php artisan db:seed
フェイク一覧
メソッド名 | 説明 |
---|---|
address | ランダムな住所を生成 |
asciiify($string = ‘****’) | ASCII文字列を生成 |
boolean($chanceOfGettingTrue = 50) | true または false を生成 |
buildingNumber() | 建物番号を生成 |
city() | 都市名を生成 |
company() | ランダムな会社名を生成 |
country() | 国名を生成 |
countryCode() | 国コードを生成 |
currencyCode() | 通貨コードを生成 |
date($format = ‘Y-m-d’, $max = ‘now’) | ランダムな日付を生成 |
dateTime($max = ‘now’, $timezone = null) | ランダムな日付と時刻を生成 |
domainName() | ランダムなドメイン名を生成 |
email() | メールアドレスを生成 |
fileExtension() | ランダムなファイル拡張子を生成 |
firstName() | 名(ファーストネーム)を生成 |
freeEmail() | GmailやYahooなどのフリーメールアドレスを生成 |
hexColor() | 16進数表記のカラーコードを生成 |
iban() | 国際銀行口座番号(IBAN)を生成 |
ipv4() | ランダムなIPv4アドレスを生成 |
ipv6() | ランダムなIPv6アドレスを生成 |
isbn13() | ISBN-13コードを生成 |
jobTitle() | ランダムな職業タイトルを生成 |
lastName() | 姓(ラストネーム)を生成 |
latitude() | 緯度を生成 |
longitude() | 経度を生成 |
macAddress() | ランダムなMACアドレスを生成 |
mimeType() | ランダムなMIMEタイプを生成 |
name() | フルネームを生成 |
numberBetween($min, $max) | 指定範囲内の整数を生成 |
paragraph($nbSentences = 3, $variableNbSentences = true) | ランダムな段落を生成 |
password($minLength = 6, $maxLength = 20) | パスワードを生成 |
phoneNumber() | ランダムな電話番号を生成 |
postcode() | 郵便番号を生成 |
randomDigit() | 0から9までのランダムな数字を生成 |
randomElement($array = array(‘a’,’b’,’c’)) | 配列からランダムな要素を選択 |
randomFloat($nbMaxDecimals, $min, $max) | 指定範囲内の浮動小数点数を生成 |
rgbColor() | RGB表記のカラーコードを生成 |
safeEmail() | 実在しない安全なメールアドレスを生成 |
sentence($nbWords = 6, $variableNbWords = true) | ランダムな文を生成 |
slug() | URLスラッグを生成 |
state() | 州名を生成 |
streetAddress() | 番地を含む住所を生成 |
text($maxNbChars = 200) | 指定された文字数以内のテキストを生成 |
time($format = ‘H:i:s’, $max = ‘now’) | ランダムな時刻を生成 |
timezone() | タイムゾーン名を生成 |
url() | ランダムなURLを生成 |
userAgent() | ランダムなユーザーエージェント文字列を生成 |
userName() | ユーザー名を生成 |
uuid() | UUIDを生成 |
word() | ランダムな単語を生成 |
わかりにく所の補足
asciiify()
// デフォルト設定での使用
$randomString = fake()->asciiify();
(例: a8X2)
// カスタムパターンでの使用
$randomString = fake()->asciiify('****-****');
(例: G7d9-Jk3p)
// 他の文字を含むパターンでの使用
$randomString = fake()->asciiify('User-****');
例: User-a1B2)
boolean()
// 50%の確率でtrue、50%の確率でfalseをランダムに生成
$randomBoolean = fake()->boolean();
// 70%の確率でtrue、30%の確率でfalseをランダムに生成
$randomBoolean = fake()->boolean(70);
date()
// 'Y-m-d'形式で現在の日付までのランダムな日付を生成
$randomDate = fake()->date();
// 'd-m-Y'形式で現在の日付までのランダムな日付を生成
$randomDate = fake()->date('d-m-Y');
// 'Y-m-d'形式で、2020-12-31までのランダムな日付を生成
$randomDate = fake()->date('Y-m-d', '2020-12-31');
// 日付と時間を含む形式で、現在までのランダムな日時を生成
$randomDateTime = fake()->date('Y-m-d H:i:s');
dateTime()
// ユーザーの最後のログイン日時をランダムに設定します。過去の任意の日時が生成
$lastLogin = fake()->dateTime();
// 2022年12月31日23時59分59秒までの任意の日時を生成
$eventDateTime = fake()->dateTime('2022-12-31 23:59:59');
// ニューヨーク時間での現在までのランダムな公開日時を生成
$publishDateTime = fake()->dateTime('now', 'America/New_York');
numberBetween()
// 10から100の間でランダムな整数を生成
$randomNumber = fake()->numberBetween(10, 100);
(例: 42)
// -50から50の間でランダムな整数を生成
$randomNumber = fake()->numberBetween(-50, 50);
(例: -7)
paragraph()
// 3文からなるランダムな段落を生成され文の数は若干変動することがあり
$randomParagraph = fake()->paragraph();
// 5文からなるランダムな段落を生成され文の数は若干変動することがあり
$randomParagraph = fake()->paragraph(5);
// 4文からなる段落を生成され文の数は厳密に4文に固定し変動しない
$randomParagraph = fake()->paragraph(4, false);
password()
// 6文字から20文字の間でランダムなパスワードを生成
$randomPassword = fake()->password();
// ユーザーのパスワードを8文字から16文字の間でランダムに生成
$userPassword = fake()->password(8, 16);
randomElement()
// デフォルトの配列['a', 'b', 'c']の中からランダムに1つの要素を選ぶ
$randomElement = fake()->randomElement();
(例: b)
// ['apple', 'banana', 'cherry']の中からランダムに1つの要素を選ぶ
$randomElement = fake()->randomElement(['apple', 'banana', 'cherry']);
(例: banana)
// [10, 20, 30, 40, 50]の中からランダムに1つの要素を選ぶ
$randomElement = fake()->randomElement([10, 20, 30, 40, 50]);
(例: 30)
randomFloat()
// 小数点以下2桁の数値を1から100の間でランダムに生成
$randomFloat = fake()->randomFloat(2, 1, 100);
(例: 45.67)
// 小数点以下3桁の数値を-1000から1000の間でランダムに生成
$randomFloat = fake()->randomFloat(3, -1000, 1000);
(例: -456.789)
sentence()
// 6単語程度のランダムな文章を生成し単語数は多少変動することがあり
$randomSentence = fake()->sentence();
(例: "The quick brown fox jumps over")
// 10単語程度のランダムな文章を生成
$randomSentence = fake()->sentence(10);
(例: "The quick brown fox jumps over the lazy dog quickly and quietly")
// 厳密に5単語からなる文章を生成
$randomSentence = fake()->sentence(5, false);
(例: "The cat sits on grass")
text()
// 最大200文字までのランダムなテキストを生成
$randomText = fake()->text();
// 100文字以内のランダムなテキストを生成
$randomText = fake()->text(100);
time()
// 'H:i:s'形式で、00:00:00から現在時刻までのランダムな時刻を生成
$randomTime = fake()->time();
(例: 14:35:22)
// 'H:i'形式でランダムな時刻を生成
$randomTime = fake()->time('H:i');
(例: 14:35)
// 00:00:00から23:59:59の間でランダムな時刻を生成
$randomTime = fake()->time('H:i:s', '23:59:59');