laravel seeder 初期データ コマンドで一発 

214 View

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);


    }
}

カテゴリー:

返信がありません

コメントを残す