Laravelでデータベースのテーブル定義をしてみた


:::note info
前提
+ Laravel Version11
+ Docker for Windows Desktop
+ Laravel Sail使用
+ 過去記事「[Laravelをインストールしてみた](https://qiita.com/AKFJ21/items/c8f1052b7b321917cafc)」の状態
:::

## 概要
メッセージなどを投稿できる掲示板を作るため、そのデータベース用テーブルを設定します。

## 参照
https://laravel.com/docs/11.x/migrations

## テーブル名：掲示板（boards）：表示項目
+ 投稿者ID(user_id)
+ タイトル(title)
+ カテゴリ(category)
+ 本文(texts)
+ 掲載期限(date_expiry)

## 作業
+ 1.テーブル定義ファイルの生成
+ 2.テーブル定義
+ 3.データベースに適用



## 1-1.テーブル定義ファイルの生成（マイグレーションファイルの生成）
Laravelのコマンドを使ってファイルを生成します。
なお、今回はこの方法を使わず、別の方法（下記）を使いました。

```shell:コマンド例１
./vendor/bin/sail php artisan make:migration create_boards_table
```
or
```shell:コマンド例２
./vendor/bin/sail php artisan make:migration --create --table boards
```
コマンドの「boards」は定義したいテーブル名です。複数形にするのがLaravel流のようです。
例１は、生成されるファイル名を指定する方法です。ファイル名の最後は'_table'とするようです。これでテーブル定義用と認識され、その前の文字列をテーブル名として認識され、定義ファイルが生成されます。'create'のところは何でも良さそうです。新規の場合は'create'、項目追加の場合は'add_columns'とかテーブル定義の更新履歴が分かるようにしておくのが良さそうです。
例２は、コマンドでテーブル名だけ指定して、その後でファイル名を入力する方法です。
```shell:コマンド例２
./vendor/bin/sail php artisan make:migration --create --table boards

 ┌ What should the migration be named? ─────────────────────────┐
 │ E.g. create_flights_table                                    │
 └──────────────────────────────────────────────────────────────┘
```


## 1-2.テーブル定義ファイルの生成（モデル定義ファイルなどいっさいがっさい生成）
上の方法はテーブル定義ファイルだけを生成するのですが、Laravelはテーブル定義ファイルだけでなく、モデル定義ファイルやコントローラーファイルなどいっさいがっさいを生成してくれる方法があります。
今回は、この方法を使いました。

```shell:コマンド
 ./vendor/bin/sail php artisan make:model --all --resource Board
```
「Board」は作成したいモデル名です。先頭文字を大文字にするのが通常のようです。
「--all」はモデル定義ファイルの出力だけでなく、データベースのテーブル定義ファイルやコントローラーなど全部という意味です。全部のファイルを生成してくれますが、後で内容を定義する必要があります。
「--resource」はレコード挿入や更新・削除などの処理（動作の記述はありません）を生成してくれるので設定しました。
```shell:コンソール画面
   INFO  Model [app/Models/Board.php] created successfully.

  ・・・

   INFO  Migration [database/migrations/yyyy_mm_dd_hhmmss_create_boards_table.php] created successfully.

  ・・・
```
いろいろ作成されました。


## 2.テーブル定義

```shell:yyyy_mm_dd_hhmmss_create_boards_table.php（生成された状態：抜粋）
    public function up(): void
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('boards');
    }
```
各項目の定義をします。以下のようにしてみました。
```shell:YYYY_MM_DD_hhmmss_create_boards_table.php（編集後：抜粋）
    public function up(): void
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->comment('掲示板');
            $table->id();
            $table->foreignId('user_id')->constrained()->comment('作成者ID');
            $table->string('title', length: 100);
            $table->string('category', length: 100)->nullable();
            $table->string('texts', length: 800)->comment('メッセージ');
            $table->date('date_expiry')->comment('掲載期限');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('boards');
    }
}
```
+ ->string('項目名', 長さ)
文字列項目用：VARCHAR型
+ ->date('項目名')
日付項目用：DATE型
+ ->foreignId('***')
他テーブルのid値を設定する項目用：BIG INT型
今回、'user_id'と設定しました。この場合、usersテーブルのid項目の値を設定するという意味です。
だけど、これだけだと単にデータ型がBIG INT型になるだけのようで、制約として設定されないので->constrained()も必要かも
+ ->constrained()
制約あり項目用
+ ->comment('***')
テーブルや項目のコメント用。DB GUIツールなどで表示されます。
+ ->nullable()
値がヌルでも良い項目用

## 3.データベースに適用
```shell:コマンド
./vendor/bin/sail php artisan migrate
```