第10回 Laravel10 環境構築メモ(migrationしてtableを作る&Factoryを使ってseedingをする)

はじめに

前回は、Dockerコンテナの一般ユーザーの作り方の回で話が少しそれたのですが、今回から、何かしらのCRUDを簡単に作りながら、開発の基本を思い出そうという回になります。まずは、テーブル作成してデータを投入しないと始まらないので、migrateとseedingを使ってテーブルの作成とデータの投入をます。第10回まで来ました。特に何回目まででどこまで進めたいというのは全くないです。

Migrationファイルを作成

まずは、テーブルを作成する為のmigrationファイルの作成です。artisanのコマンドを実行します。

php artisan make:migration create_greetings_table

INFO  Migration [database/migrations/2023_12_02_140903_create_greetings_table.php] created successfully.  

実行後に以下のファイルが作成されます。

  • database/migrations/2023_12_02_140903_create_greetings_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('greetings', function (Blueprint $table) {
            $table->id();
            $table->string('country');
            $table->string('message');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('greetings');
    }
};

今回は、Greetings(挨拶)というtableを作成して、country(国名)とmessage(メッセージ)というカラムを追加してみました。

ちなみに、下記のコマンドを実行すると、

php artisan migrate:status

migrationファイルのステータスが確認できます。先ほど、作成された2023_12_02_140903_create_greetings_tableは、まだ、migrationの実行はしていないので、Pendingとなっています。ほかのファイルについては、すでに、第2回で実行済みの為、Ranという状態になっています。

  Migration name ................................................................................ Batch / Status  
  2014_10_12_000000_create_users_table ................................................................. [1] Ran  
  2014_10_12_100000_create_password_reset_tokens_table ................................................. [1] Ran  
  2019_08_19_000000_create_failed_jobs_table ........................................................... [1] Ran  
  2019_12_14_000001_create_personal_access_tokens_table ................................................ [1] Ran  
  2023_12_02_140903_create_greetings_table ............................................................. Pending  

migrateの実行

ステータスを確認したので、次にmigrateを実行してみます。

php artisan migrate

  INFO  Running migrations.  

  2023_12_02_140903_create_greetings_table .......................................................................... 35ms DONE

DBブラウザで確認するとgreetingsというtableが作成されてますね。

greetings

念のため、statusを確認するために、先ほどのphp artisan migrate:statusを実行すると、下記の通り、2023_12_02_140903_create_greetings_tableもRanの状態になっています。ちなみに、Ranの横の数字は、php artisan migrateを実行すると繰り上がります。この数字は、Rollbackしたい時にbatchの数字を指定して、そこまで元に戻したりするのに使いますが、今日は、使いません。

  2014_10_12_000000_create_users_table ................................................................................ [1] Ran  
  2014_10_12_100000_create_password_reset_tokens_table ................................................................ [1] Ran  
  2019_08_19_000000_create_failed_jobs_table .......................................................................... [1] Ran  
  2019_12_14_000001_create_personal_access_tokens_table ............................................................... [1] Ran  
  2023_12_02_140903_create_greetings_table ............................................................................ [2] Ran 

ModelとFactoryの作成

テーブルが出来たので、続けて、ModelとFactoryを作成します。-fのオプションを指定することで、Modelと一緒にFactoryも作成してくれます。(オプションは他にもあるので、興味のある人は調べてみてください)

 php artisan make:model Greeting -f

   INFO  Model [app/Models/Greeting.php] created successfully.  

   INFO  Factory [database/factories/GreetingFactory.php] created successfully.  

上記のコマンドを実行するとファイルが2つ作成されます。

  • app/Models/Greeting.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Greeting extends Model
{
    use HasFactory;
}

app/Models/Greeting.phpは、今回は、何も修正しません。

  • database/factories/GreetingFactory.php

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Greeting>
 */
class GreetingFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'name' => fake()->country(),
            'message' => fake()->text(200),
        ];
    }
}

は、Laravelに標準で備わっているfackerというライブラリーを使用して、テスト用のデータを自動生成するようにします。ちなみに、config/app.phpの'faker_locale'を 'ja_JP'に指定すると日本語のデータも自動生成される様です。(が、私はどっちでも良いので英語のままで使ってます)

最後に、DatabaseSeeder.phpを修正してseedingでテストデータを作成できるようにします。今回は、20件のデータを作成しています。

  • database/seeders/DatabaseSeeder.php

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use App\Models\Greeting;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        Greeting::factory()->count(20)->create();
    }
}

ここまでで、準備が整ったので、seedのコマンドを実行してみます。

php artisan db:seed

   INFO  Seeding database.  

それでは、データベースの中身を確認してみます。ちゃんと20件のデータが作成されていました。

greetings


この記事が気に入ったらサポートをしてみませんか?