icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【フレームワークLaravel】データベースのシーディングやってみる・コマンドやSeederファイルの書き方

更新: 2024/09/25 3006文字

今回は、前回の記事で行った『Laravelデータベースマイグレーション』に続いて、データベースのシーディングを行ってみます。前回同様、コマンドやエディットするファイルなどの手順も紹介。さっそくやってみましょうか。

Laravelのデータベースシーディングとは?

ダミーデータなどの、データベースに初期データセットを入力するのを、プログラミング系の用語で『シーディング』というようです。管理人は普通にダミーデータ入力と言っていたため、この用語は最近になって知りました。

Laravelにもシーディングの機能はあって、DatabaseSeederクラスのメソッドを呼んだりして実行できる、とのことです。詳しくは公式ドキュメントも読んでみてください。

Laravelのデータベースシーディング方法

データベース元の状態

前回の記事で、マイグレーションを使って、Laravelに接続しているsqlデータベースに、『t_user』というテーブルを用意しました。この段階では実際のデータがまだ入っていません。そこで今回は、シーディングを使って実際のデータを行っていきます。

make:seederコマンドでシーディングのファイルを作成

まずは、シーディングのファイルを作成します。これには専用のartisanコマンドが用意されていますね。作るファイル名は、テーブル名に合わせて『t_userTableSeeder』としましょうか。コマンドは以下の通りです。(cdでlaravelが入っているディレクトリを指定しています。make:seederの後ろがファイル名。)

cd /xampp/htdocs/laravel
php artisan make:seeder t_userTableSeeder

laravel/database/seeders内に『t_userTableSeeder.php』が作成されました。

t_userTableSeeder.phpの中身はこんな感じ。『run』というメソッドがありますけど、中身は無し。ここにシーディング時に行いたい内容を書いていきます。

なお『function run():void』というのがありますが、PHP 7.1.0 以降の関数が値を返さないことを示す型です。PHPマニュアル記載内容だと『戻り値を使おうとした場合はその値は null と評価』とのことです。無くても動かすことができました(return内容をデータベースに入れる、というわけではないため)。

作成されたt_userTableSeeder.phpに処理記載

生成されたt_userTableSeeder.phpをエディットします。runメソッド中身はこんな感じ。いっこいっこ作ってもいいんんですけど、今回は『ダミーデータをシーディングでサクッと入れる』ということで、ループで回して10件入れます(idはオートインクリメントで自動で入ります)。

public function run()
{
 for($i = 1; $i <= 10; $i++){v   $age = $i+20;
  $param = [
   'mail'=>'num'. $i. '-info@example.net',
   'name'=>'〇〇〇no.'. $i,
   'age'=>$age,
  ];
  DB::table('t_user')->insert($param);
 }
}

また『use Illuminate\Support\Facades\DB;』をロードしている理由は、DBクラスのinsertを使いたいからです。

DatabaseSeeder.php内で、作ったt_userTableSeederをコールする

t_userTableSeeder.phpだけでは動かなくて、元々あったDatabaseSeeder.php内でコールします(家にあったLaravel参考書で調べました)。DatabaseSeeder.phpのrunメソッドに追加したコードは以下の通り。

$this->call(t_userTableSeeder::class);

書籍やサイトによっては『作ったシーダーを登録する』というような表現になっていることもあります。

php artisan db:seedコマンドでシーディングを実行する

ここまできたら、あとはコマンドを入れてシーディングを実行します。コマンドは以下の通り。

php artisan db:seed

682.66 ms DONEというよな表示がでました。無事に実行されたみたいですね。

シーディングの実行結果

データベースを見てみました。ループで回した適当なレコードですが(笑)、きちんと登録されているようです。これSQL手打ちでやったら、相当めんどくさいですね。

エラー例(Class "Database\Seeders\DB" not found)

今回の件で、ちょっとエラーが出てしまったので、それの対応も紹介(Class "Database\Seeders\DB" not found)。上の段落で、DBクラスのinsertを使う話をしたんですけど、これが見つからないというエラーです。

原因は『Illuminate\Support\Facades\DB;』をロードしていないので、該当のクラスが見つかってないわけです。use Illuminate\Support\Facades\DB;を追記したのは、これに対応するためです。

あとがき・まとめ

  • Laravelはシーディングでダミーデータ・初期データを登録する仕組みがある
  • 手順はコマンドでファイル生成、メソッドを書いてDatabaseSeeder.php内でコールし、またコマンドで実行
  • DBクラスのinsertを使うときは、use Illuminate\Support\Facades\DB追記する

まとめると、こんなところでしょうか。cmsとか構築するときの初期の表示確認用データ、ダミーの商品や従業員・ユーザーデータなどにも使えるかもしれません。


【カテゴリ】- Laravel
【タグ】- ,

関連記事