このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。
This project is maintained by okinaka
シーダ(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法もLaravelには備わっています。全シーダクラスはdatabase/seeds
に保存します。シーダクラスには好きな名前を付けられます。しかしUsersTableSeeder
などのような分かりやすい規則に従ったほうが良いでしょう。デフォルトとしてDatabaseSeeder
クラスが定義されています。このクラスからcall
メソッドを使い他の初期値設定クラスを呼び出すことで、シーディングの順番をコントロールできます。
シーダーを生成するには、make:seeder
Artisanコマンドを実行します。フレームワークが生成するシーダーは全てdatabase/seeds
ディレクトリに設置されます。
php artisan make:seeder UsersTableSeeder
シーダクラスはデフォルトでrun
メソッドだけを含んでいます。このメソッドはdb:seed
Artisanコマンドが実行された時に呼びだされます。run
メソッドの中でデータベースに何でも好きなデーターを挿入できます。クエリビルダでデータを挿入することも、もしくはEloquentモデルファクトリを使うこともできます。
{tip} データベースシーディング時、複数代入は自動的に無効になります。
例として、Laravelのインストール時にデフォルトで用意されているDatabaseSeeder
クラスを変更してみましょう。run
メソッドにデータベースINSERT文を追加します。
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
/**
* データベース初期値設定の実行
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
もちろんそれぞれのモデルシーダで属性をいちいち指定するのは面倒です。代わりに大量のデータベースレコードを生成するのに便利なモデルファクトリが使用できます。最初にモデルファクトリのドキュメントを読んで、どのように定義するのかを学んでください。ファクトリが定義できれば、データベースにレコードを挿入するfactory
ヘルパ関数が利用できます。
例として50件のレコードを生成し、それぞれのユーザーへリレーションを付加してみましょう。
/**
* データベース初期値設定の実行
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
}
DatabaseSeeder
クラスの中で追加のシーダクラスを呼び出すcall
メソッドが使えます。call
メソッドを使うことで、圧倒されるぐらい大きな1ファイルを使う代わりに、データベースシーディングを複数のファイルへ分割できます。実行したいシーダクラス名を渡すだけです。
/**
* データベース初期値設定の実行
*
* @return void
*/
public function run()
{
$this->call([
UsersTableSeeder::class,
PostsTableSeeder::class,
CommentsTableSeeder::class,
]);
}
シーダクラスを書き上げたら、データベースへ初期値を設定するためにdb:seed
Artisanコマンドが使えます。デフォルトでdb:seed
コマンドは、他のシーダクラスを呼び出すDatabaseSeeder
クラスを実行します。しかし特定のファイルを個別に実行したい場合は、--class
オプションを使いシーダを指定してください。
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
もしくはマイグレーションをロールバックし再実行するmigrate:refresh
コマンドを使っても、データベースに初期値を設定できます。このコマンドはデータベースを完全に作成し直したい場合に便利です。
php artisan migrate:refresh --seed