こんにちは!エンジニアのオータケです!
Laravelはとても便利で開発が楽しいフレームワークです。Laravelで開発を始めてからすっかりその魅力に取りつかれてしまいました。
いろんなところに手が届き、とっても楽ですよね。
さて、今回はWebアプリケーションを開発していて、こんなことを感じることはありませんか?
「自分で開発したWebサイトの動作確認時にデータを登録しなきゃいけないけど面倒くさい」
「ログイン後の機能の動作チェックを行いたいが、会員登録を何かあるたびにしないといけない」
「マイグレーションでテーブルの構造を変更する際に今まで登録した仮データをまた登録しないといけない。」
こんなお悩みを抱えてる方には朗報です!
Laraveのシーディング機能を使うことでこれらの悩みをい解決することが可能なんです!
この記事では次の内容を解説します。
[基礎] シーディングとは?
[基礎] シーダークラスを作ろう
[基礎] 実際に動かしてデータを生成する
これらのことについて解説を行います。
先程の悩みを抱えている方は必見です!
シーディングとは?
何ができるの?
まず、シーディングとは何でしょうか?
シーディングはもともとシーダーという言葉から来ていますが、このシーダー(Seeder)は初期値を意味し、データベース構築時に初期データを流し込むために使われます。
どういったデータを生成するのかといったルールをプログラムで事前に書いておけば数件、数十件、数百件といったデータを自動で生成することができます。
でも、これだけを見ると「え、プログラムわざわざ書くの!?」と思われる方もいるかもしれません。
そういった疑問については次の項について見ていきましょう。
わざわざプログラム書かなきゃいけないの?
シーディングがどういったものかは簡単ながら理解してもらえたかと思います。
しかし、データを生成するためにプログラムを書かなきゃいけないということで少し気が引ける方もいるかもしれませんが、実際のコード例を見てみましょう。
$factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => 'XXXXXXXXXXX', // secret 'remember_token' => str_random(10), ]; });
例えば、冒頭にあったようにログイン後の機能を使ったり動作確認をしたい時に会員登録するのは面倒ですよね?
また、開発中にユーザーに関するテーブルの構造を変更した際にマイグレーションを行いデータが失われた場合は再度データを登録し直さなければならない場合もあります。
そういった手間を一気に削るために上記のようなコードを書いて初期データを自動生成することで、動作確認や面倒な作業の手間を省くことができます。
あなたの作業を楽にすること間違いなし
シーディングは初期データが数百件など必要な場合は説明が不要なくらい、先程のプログラムを書いたほうが断然効率的ですよね!
一度プログラムを書いておけばテーブル構造の変更などがない限りはマイグレーションし直した直後にコマンド一発でデータを生成することができます。
その便利な機能であるシーディング機能の使い方をこれから次の章で具体的に見ていきましょう!
シーダークラスを作ろう
まずはシーディングに必要な、シーダークラスというものを作る必要があります。
artisanコマンドを使ってシーダークラスを生成してみましょう
ターミナル(Windowsの場合はコマンドプロンプト)を開いて、プロジェクトディレクトリ直下へ移動してから次のコマンドを打ちます。
artisan make:seeder HogeTableSeeder
Seeder created successfully.
このように表示されれば成功です!
成功した場合は、database/seedsディレクトリの中にHogeTableSeeder.phpというファイルが生成されているはずです。
ファイルを開くと、runというメソッドがすでに記述されているかと思います。
このファイルがシーディング処理が走るメソッドになります。
ここに処理を追記していくことで様々なことができるようになります。
では次に、初期のダミーデータを生成するFactoryクラスを作ってみましょう。
こちらも、ターミナルでコマンドを打ちます。
artisan make:factory HogeFactory
Factory created successfully.
このように表示されればFactoryクラスも生成されています。
Factoryクラスはdatabase/factoriesディレクトリにHogeFactory.phpというファイルが生成されています。
このファイルを開くと冒頭に載せたコードと同じようなコードがでてきます。
ここにどういったデータを生成するかを記述していくことでテーブルの構造にあったダミーデータを生成することができます。
次の章で実際に生成していきましょう。
データを生成しよう
プログラム編
先程作ったHogeTableSeederやFactoryクラスはhogesというテーブルがあることを前提に作っています。
今回のhogesテーブルでは次のような構成と仮定して話を進めます。
id : integer name : string score: integer
このテーブル構造通りにデータを自動生成してみたいとおもいます。
HogeFactory.php
<?php use Faker\Generator as Faker; use App\Hoge; $factory->define(Hoge::class, function (Faker $faker) { return [ 'name' => $faker->name, 'score' => $faker->numberBetween(0, 100) ]; });
先程テーブルの構造を書いたとおり今回は「名前」と「スコア」を自動生成できるようにします。
名前では$faker->nameと書くだけで勝手に名前が生成されます。
ただし、外国の方の名前になります。
次に、スコアですが0点以上100点以下としたいのでnumberBetweenメソッドを使うことでそれを実現することができます。
これを書くことでデータを生成する際に名前やスコアがルールに従ってランダムに生成される仕組みになっています。
とっても簡単で便利ですよね?
しかし、まだこれを書いただけではデータを生成することはできません。
今のはどういったデータを生成するのかというルールを決めただけに過ぎないため、次に実際にデータを生成する処理を書く必要があります。
それは次のような形でHogeSeeder.phpに記述します。
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; class HogeTableSeeder extends Seeder { public function run() { factory(App\Hoge::class, 80)->create(); } }
factory機能を呼び出したあとにcreateメソッドを呼び出していることがわかるかと思います。
どういったモデルのデータを何件生成するのかをここで決めています。
今回の場合はHogeモデル(hogesテーブル)のデータを80件生成するということになります。
(事前にHogeモデルは生成されている必要があります。)
これで実行しましょう!と行きたいところですが、最後に1つ手順を踏む必要があります。
HogeSeeder.phpと同じディレクトリに存在しているDatabaseSeeder.phpに処理を記述する必要があります。
このファイル内にHogeTableSeederの処理を呼び出すように記述すればようやく実行することができます!
DatabaseSeeder.php
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; use App\Hoge; class DatabaseSeeder extends Seeder { public function run() { Model::unguard(); $this->call(HogeTableSeeder::class); } }
callメソッドを使ってHogeTableSeederクラスの実行しています。
こうすることであとは実行するだけで、ダミーデータが大量に生成されるようになります!
生成編
では最後に今まで作ってきたプログラムをもとにダミーデータを生成してみたいと思います。
このコマンドを打つことでダミーデータを生成することが可能です。
artisan db:seed
Seeding: HogeTableSeeder
こういった結果になった場合は、成功しているので無事ダミーデータが生成できたことになります!!
まとめ
いかがでしょうか?
今回はシーディングという機能の使い方について見てきました。
手作業で行っていたダミーデータ作成などが一瞬で終わるのでぜひ使ってくださいね!