Laravel には、fill クラスとテストデータを使用してデータベースにデータを入力する簡単な方法が含まれています。すべてのフィラー クラスは、database/seeds ディレクトリにあります。フィラー クラスのクラス名は完全にカスタマイズできますが、UserTableSeeder などの読みやすさなど、特定のルールに従うことが最善です。 Laravel をインストールすると、デフォルトで DatabaseSeeder クラスが提供されます。このクラスから、call メソッドを使用して他の約定クラスを実行し、約定順序を制御できるようになります。
フィラーを生成するには、アーティザン コマンド make:seeder を使用できます。フレームワークで生成されたすべての shim は、database/seeders ディレクトリにあります:
php artisan make:seeder UserTableSeeder
shim クラスには、デフォルトでメソッドが 1 つだけ含まれています: run。このメソッドは、Artisan コマンド db:seed の実行時に呼び出されます。 run メソッドでは、必要なデータをデータベースに挿入できます。クエリ ビルダーを使用して手動でデータを挿入することも、Eloquent モデル ファクトリを使用することもできます。
たとえば、Laravel インストールに付属する DatabaseSeeder クラスを変更して、run メソッドにデータベース挿入ステートメントを追加しましょう:
<?phpuse DB;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'), ]); }}
モデル ファクトリを使用する
もちろん、各モデルに設定される属性を手動で指定するのは面倒ですし、面倒ですが、代わりに、モデル ファクトリを使用して、大量のデータベース レコードを簡単に生成できます。まず、モデル ファクトリのドキュメントを参照して、ファクトリを定義する方法を確認してください。ファクトリを定義した後、ヘルパー関数ファクトリを使用してデータベースにレコードを挿入できます。
たとえば、50 人のユーザーを作成し、各ユーザーに関係を追加してみましょう:
/** * 运行数据库填充 * * @return void */public function run(){ factory('App\User', 50)->create()->each(function($u) { $u->posts()->save(factory('App\Post')->make()); });}
追加のポピュレータを呼び出す
DatabaseSeeder クラスでは、call メソッドを使用して追加のポピュレータ クラスを実行できます。call メソッドを使用すると、データベースの母集団を次のように分割できます。単一のポピュレータ クラスが無限に大きくならないように、複数のファイルを作成します。実行したいポピュレータ クラス名を渡すだけです:
/*** 运行数据库填充** @return void*/public function run(){ Model::unguard(); $this->call(UserTableSeeder::class); $this->call(PostsTableSeeder::class); $this->call(CommentsTableSeeder::class); Model::reguard();}
フィラー クラスを作成した後、Artisan コマンド db:seed を使用できます。データベースを埋めるために。デフォルトでは、db:seed コマンドは、他のフィラー クラスの実行に使用できる DatabaseSeeder クラスを実行しますが、 --class オプションを使用して、実行するスタンドアロン フィラー クラスを指定することもできます。また、 merge:refresh コマンドを使用してデータベースにデータを追加します。これにより、移行をロールバックして再実行することもできます。これは、データベースを完全に再構築する必要がある場合に役立ちます。