laravelで開発を進めていると、途中でDBの構造をかえたり、データを一掃して初期データにもどしたいときもあります。そのときに、コマンド、
php artisan migrate:refresh
でテーブルのリフレッシュをすると、データも一掃するのはすぐできますが、初期データを再度、いれるのは面倒くさいです。これが、一回ならまだしも、1日に5,6回DBの構造をかえるために、リフレッシュしたり、テストのためにリフレッシュしたりもします。
そんなときは、laravel seedをつかえばコマンド一発で初期データを何度でもつくれるようになります。
seederの作成
今回は、usersテーブル、rolesテーブル、中間テーブルであるrole_userテーブルのseederをつくります。
まず、usersテーブル用のseederはこれっすね
php artisan make:seeder UserSeeder
このコマンドを実行すると、ここにファイルができます。runメソッド内に作りたいデータをかいてきます。
自分の場合はこのようなデータをいれました。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
User::create([
'id' => 1,
'name' => '平山健太',
'avatar' => 'user_default.jpg',
'note' => 'Nice to meet you!',
'is_exist' => 1,
'email' => 'hirayamakenta0511@gmail.com',
"email_verified_at" => "2024-02-01 00:00:00",
'password' => 'hash化されたパスワード',
"created_at" => "2024-02-01 00:00:00",
"updated_at" => "2024-02-01 00:00:00",
]);
User::create([
'id' => 2,
'name' => 'テストユーザー1',
'avatar' => 'user_default.jpg',
'note' => 'Nice to meet you!',
'is_exist' => 1,
'email' => 'test@test',
"email_verified_at" => "2024-02-01 00:00:00",
'password' => 'hash化されたパスワード',
"created_at" => "2024-02-01 00:00:00",
"updated_at" => "2024-02-01 00:00:00",
]);
}
}
注意すべきことは、つくるテーブルがモデルを持っている場合は、そのモデルを利用してつくったほうがsmartなので、use モデルしましょう。
ひとまずusersテーブルだけでいいなら
まあ、単純化するために、いったんusersテーブルだけコマンドでいつでもぱっとつくれたらOKなら、次は、近くにあるDatabaseSeeder.phpファイルにこれをかきましょう。
これで完成です。
あとは、コマンド
php artisan db:seed
をすると、DBに直接、さきほど書いたUserレコードが追加されます。
このコマンドでは、DatabaseSeeder.phpファイルのrunメソッドの内容を実行します。
なので、実際の運用としては、
php artisan migrate:refresh //テーブルをいったん消して再度つくりなおす(データはもちろんすべて消える)
php artisan bd:seed //DatabaseSeeder.phpファイルのrunメソッドの実行
この2つのコマンドでデータ初期化が完成です。
+α テーブルがモデルをもたないときは?
たとえば、中間テーブルをつかうとき、中間テーブルのモデルは基本的につくらないです。
そんなときも中間テーブルにseederで初期データを作る方法です。
今回は、userに役職(role)を与えるとして、ひとまず、rolesテーブルのseederはuserと同じようにつくります。
コマンド
php artisan make:seeder RoleSeeder
そして、つくるデータはこれにします。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Role;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Role::create([
'id' => 1,
'name' => 'admin',
]);
Role::create([
'id' => 2,
'name' => 'user',
]);
}
}
そして、DatabaseSeeder.phpファイルのrunメソッドにも追加します。
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(UserSeeder::class);
$this->call(RoleSeeder::class);
}
}
さあ、role_userテーブルはどうしようか?
では、本題ですね、仕様としては、userには,adminもしくは、userの役職のどれか、もしくは、どちらもあたえれるようにします。逆もしかりで、admin管理は、複数人userがもてるようにするので、多対多のリレーションで中間テーブルでデータを管理することになります。
ひとまず、おなじようにseederをコマンドでつくります。
php artisan make:seeder RoleUserSeeder
まあ、答えからいうと下記のとおりです。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class RoleUserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('role_user')->insert(
[
'user_id' => 1,
'role_id' => 1,
]
);
DB::table('role_user')->insert(
[
'user_id' => 2,
'role_id' => 2,
]
);
}
}
着目すべき点は、use Illuminate\Support\Facades\DB;
これをuseすることでDB::table(‘role_user’)->insert()の書き方が可能になる。
そして、この後はちゃんと、DatabaseSeeder.phpファイルのrunメソッドに追加して完成
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(UserSeeder::class);
$this->call(RoleSeeder::class);
$this->call(RoleUserSeeder::class);
}
}
返信がありません