シーディングの機能を利用してデータベースにデータを自動で登録してみます。
本記事ではMySQLを利用し、Laravelとすでに接続済みの環境において、下記のbooksテーブルを利用することを前提に話を進めていきます。
1 2 3 4 5 6 7 8 9 10 |
mysql> SHOW COLUMNS FROM books; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | title | varchar(255) | NO | | NULL | | | stock | int(11) | NO | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ |
主に以下の手順を取ります。
シーダ(クラス)ファイルの作成
DatabaseSeeder.phpへの登録
シーダの実行
シーダ(クラス)の作成
シーダクラスのファイルを作成します。
1 |
$ php artisan make:seeder BooksTableSeeder |
生成されたファイルを下記のように編集します。まずはDBファサードを利用した記述です。
database/seeds/BooksTableSeeder.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php use Illuminate\Database\Seeder; class BooksTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $books = [ [ 'title' => 'hoge1', 'stock' => 2, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], [ 'title' => 'hoge2', 'stock' => 4, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], [ 'title' => 'hoge3', 'stock' => 6, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], ]; DB::table('books')->insert($books); } } |
Eloquentを利用した記述は下記のようになります。あらかじめBookモデルを作成していることが前提です。
database/seeds/BooksTableSeeder.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php use Illuminate\Database\Seeder; use App\Book; class BooksTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $book = new Book([ 'title' => 'hoge1', 'stock' => 2, ]); $book->save(); $book = new Book([ 'title' => 'hoge2', 'stock' => 4, ]); $book->save(); $book = new Book([ 'title' => 'hoge3', 'stock' => 6, ]); $book->save(); } } |
関連ページ
DatabaseSeeder.phpへの登録
次に作成したシーダファイル(クラス)を呼び出す(実行する)ための設定を、DatabaseSeeder.phpに記述します。
database/seeds/DatabaseSeeder.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(BooksTableSeeder::class); } } |
シーダの実行
シーダを実行します。
1 |
$ php artisan db:seed |
もしくは–classオプションにクラス名を指定することができます。
1 |
$ php artisan db:seed --class=BooksTableSeeder |
以上でテーブルにデータを登録することができます。
1 2 3 4 5 6 7 8 |
mysql> SELECT * FROM books; +----+-------+-------+---------------------+---------------------+ | id | title | stock | created_at | updated_at | +----+-------+-------+---------------------+---------------------+ | 1 | hoge1 | 2 | 2020-03-05 08:35:05 | 2020-03-05 08:35:05 | | 2 | hoge2 | 4 | 2020-03-05 08:35:05 | 2020-03-05 08:35:05 | | 3 | hoge3 | 6 | 2020-03-05 08:35:05 | 2020-03-05 08:35:05 | +----+-------+-------+---------------------+---------------------+ |
Factory / Faker
データを大量に自動生成しテーブルに登録するには、Factory(ファクトリ)とFakerを利用します。
–modelオプションに対象とするモデル指定し、下記コマンドを実行します。
1 |
$ php artisan make:factory BookFactory --model=Book |
BookFactory.phpが生成されるので、下記のように編集します。Fakerライブラリーによってtitleの文字列およびstockの0から100の数値をランダムに自動生成してくれるようになります。
database/factories/BookFactory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php /** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\Book; use Faker\Generator as Faker; $factory->define(Book::class, function (Faker $faker) { return [ 'title' => $faker->word(), 'stock' => $faker->numberBetween($min = 0, $max = 100) ]; }); |
word()やnumberBetween()の他にもemail()やphoneNumber()など多くのデータ形式をランダムに生成することができます。
参照ページ
はじめに作成したシーダクラスのファイルを下記のように編集します。
database/seeds/BooksTableSeeder.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php use Illuminate\Database\Seeder; use App\Book; class BooksTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { factory(Book::class, 100)->create(); } } |
以上でシーダを実行すると100件のレコードが登録されているのが確認できます。
日本語で登録するにはapp.phpを下記のように設定します。
config/app.php
1 |
'faker_locale' => 'ja_JP', |
キャッシュをクリアしておきます。
1 |
$ php artisan config:clear |
参照ページ
Laravel 6.x データベースのテスト