Laravel の DatabaseSeeder は特別なクラスで、 php artisan db:seed
を実行したときに呼び出されるクラスです。
DatabaseSeeder は、 php artisan migrate:fresh --seed
などでも利用できるので、開発環境でも活躍します。
今回は、 DatabaseSeeder を本番環境のマスタデータ登録などでも利用したいなーという場合のサンプルを紹介します。
前提条件
- deployの際に、必ず
php artisan migrate --seed
を実行する - 開発環境と本番環境は、 .env ファイルの
APP_ENV
で切り替える。APP_ENV=production
のときは本番環境とする
目次
サンプルソースコード
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class GroupsTableSeeder extends Seeder
{
/**
* Auto generated seed file
*
* @return void
*/
public function run()
{
\DB::table('groups')->upsert([
['id' => 1, 'name' => '一般会員', 'description' => '会員登録から登録したばかりのお客さま'],
['id' => 2, 'name' => 'ゴールド会員', 'description' => '1年以上継続して登録しているお客さま'],
['id' => 3, 'name' => 'プラチナ会員', 'description' => 'ゴールド会員でかつ累計10万円以上ご購入いただいたお客さま'],
['id' => 4, 'name' => 'VIP会員', 'description' => 'オーナーまたは店長が推薦するお客さま'],
], ['id'], ['name', 'description']);
}
}
upsert を使う場合、第二引数は Primary Key を指定します!
公式情報 Laravel 8.x Eloquentの準備 更新/挿入
https://readouble.com/laravel/8.x/ja/eloquent.html#upserts
※個人的には、この方法を使用する場合には、 groups
テーブルの id
は AUTO INCREMENT はしないようにしています!直接指定するので!(^^)/
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
if (app()->isProduction()) {
// 本番環境 .env => APP_ENV=production
$this->call(GroupsTableSeeder::class);
} else {
// 開発環境・検証環境
$this->call(GroupsTableSeeder::class);
$this->call(UsersTableSeeder::class);
こうやって作成しておくと、
php artisan db:seed
を何回実行しても、groups
テーブルのデータはそのまま利用できる。- 開発環境と本番環境のマスタデータの差異を無くすことができる!コントロールされたマスタデータは気持ちの良いものです!(^^)/
- 自動deployを実行するときに、データベースの切り替えと同時にマスタデータの更新もできる!