Laravelでマイグレーションファイルを作成する手順

## はじめに
以下はLaravelと連携しているデータベースにテーブルを作成する工程のメモになります

## テーブルの名称について

テーブル名は一般的に以下のルールに沿って名称付けをされています
※必ず適用しなければならないルールではありません

- スネークケース（`snake_case`）であること
- 複数形であること（`users` や `orders` など）

## マイグレーションファイルの作成

```bash
php artisan make:migration create_items_table
```

### コマンドの説明

- php artisan
Laravelのコマンドラインインターフェース（CLI）ツールです。さまざまなLaravelの操作をコマンドで実行できます。
- make:migration
マイグレーションファイルを作成するためのコマンドです。
make はファイルやクラスを作成するためのLaravelの機能
migration はマイグレーションファイルを意味します。
- create_items_table
作成するマイグレーションファイルの名前です。通常、この名前はテーブルの作成や変更を示すために適切な名前をつけます。この場合、「items」テーブルを作成することを示しています。

#### コマンドの使い方(その他)

- create_新規のテーブル名_table
`新しいテーブルの作成する`
- add_追加するカラム名_to_既存のテーブル名_table
`既存のテーブルにカラムを追加する`
- remove_削除したいカラム名_from_対象のテーブル名_table
`既存のテーブルからカラムを削除する`
- rename_既存のテーブル名_to_新しいテーブル名
`テーブル名の変更`

## マイグレーションファイルの編集方法

データベースの「構造」を定義するためのファイルです。これを使うことで、データベースのテーブルやカラムの作成、変更、削除などを簡単に管理できます

### マイグレーションファイルの基本構造

マイグレーションファイルは主に2つのメソッド（関数）で構成されています:

- `up() メソッド`
データベースに対して行う変更を定義します。新しいテーブルを作成したり、既存のテーブルにカラムを追加したりする処理を記述します。
- `down() メソッド`
up() メソッドで行った変更を取り消すための処理を定義します。たとえば、テーブルを削除する処理などを記述します。

### マイグレーションファイルの例

```YYYY_ MM_DD_******_create_items_table.php
<?php

use Illuminate\Database\Migrations\Migration;
// Migration クラスを利用するために必要な宣言です
use Illuminate\Database\Schema\Blueprint;
// Blueprint クラスを利用するために必要な宣言です。
use Illuminate\Support\Facades\Schema;
// Schema ファサードを利用するために必要な宣言です。


class CreateItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id(); 
            // 自動的に unsignedBigInteger('id') と primary() を追加
            $table->string('name'); // 名前を保存する文字列カラム
            $table->integer('quantity'); // 数量を保存する整数カラム
            $table->timestamps(); // 作成日と更新日を保存するカラム
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('items'); // items テーブルを削除
    }
}

```

### マイグレーションファイル編集時の注意点

一般的にテーブルには一意の値を持つ`主キー（Primary Key）`が必要になります。

Laravelでは、id メソッドを使うのが一般的であり、自動的に `id` という名前のカラムを主キーとして設定します。

#### id以外を主キーとして扱いたい場合の例

```YYYY_ MM_DD_******_create_items_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateItemsTable extends Migration
{
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->unsignedBigInteger('custom_id');  // 主キーとして使うカラム
            $table->string('name');
            $table->timestamps();

            $table->primary('custom_id');  // 主キーとして指定
        });
    }

    public function down()
    {
        Schema::dropIfExists('items');
    }
}

```

##### メソッドの補足
- unsignedBigInteger メソッド
負の数（マイナスの数）は保存できず、0以上の数字だけが保存でき、
18,446,744,073,709,551,615までの整数値を保存できます

- primary メソッド
テーブルの中で特定のカラムを「主キー」として設定します。

## カラムを追加するマイグレーションを作成する
既存のテーブルにカラムを追加する場合は、以下で新しいマイグレーションファイルを作成します

```
php artisan make:migration add_column_to_table_name --table=table_name

```
- add_column_to_table_name 
マイグレーションファイルの名前です
カラムを追加する内容を示すような名前にします。

- --table=table_name
カラムを追加したいテーブルの名前を指定します

## テーブルのカラムを作成するためのメソッド一覧

### 新しいカラムを追加するための例
```php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddBirthdateToUsersTable extends Migration
{
    /**
     * マイグレーションの実行
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            // 新しいカラムを追加
            $table->date('name');
        });
    }

    /**
     * マイグレーションのロールバック
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            // カラムを削除
            $table->dropColumn('birthdate');
        });
    }
}
```


マイグレーションファイルでは、テーブルの構造を定義するためにさまざまなメソッドを使用できます。

以下は、Laravelのマイグレーションファイルでよく使われるメソッドの例です

### string (文字列のカラム)
```php
$table->string('name');
```

### text (長い文字列を保存できるカラム)
```php
$table->text('description');
```

### integer （整数値を保存できるカラム）
```php
$table->integer('age');
```

### unsignedBigInteger  (符号なしの大きな整数のカラム)
```php
$table->unsignedBigInteger('user_id');
```

### boolean (真偽値（true または false）を保存できるカラム)
```php
$table->boolean('is_active');
```

### date （日付を保存できるカラム）
```php
$table->date('birthdate');
```

### timestamp （日付と時間を保存できるカラム）
```php
$table->timestamp('created_at');
```

### timestamps （created_at と updated_at の2つのカラムを同時に作成します）
```php
$table->timestamps();
```

### enum （定義した値だけを保存できるカラム）
```php
$table->enum('status', ['pending', 'completed', 'cancelled']);
```

### decimal （小数点を含む数値を保存できるカラム）
```php
$table->decimal('price', 8, 2); // 8桁の数字（小数点以下2桁）
```

## テーブルの変更に関するメソッド一覧

以下は既存のカラム名の変更や削除、テーブルの削除に関するメソッドです

### renameColumn （カラムの名前を変更します）
```php
$table->renameColumn('old_name', 'new_name');
```
### dropColumn （既存のカラムを削除します）
```php
$table->dropColumn('column_name');
```
### dropIfExists (テーブルが存在する場合に削除します)
```php
Schema::dropIfExists('table_name');
```
※テーブルが存在しない場合には何もせずに処理を終了します

## 外部キー制約の設定をするためのメソッド
外部キーは、あるテーブルのカラム（列）が、別のテーブルのカラム（通常は主キー）を参照するために使用されるキーです。この関係を設定することで、2つのテーブル間に関連性を持たせることができます。



### マイグレーションファイルでの外部キー設定例

`orders テーブル`が `customers テーブル`の `id カラム`を参照する場合、マイグレーションファイルで外部キーを設定する方法は次のようになります。

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

class CreateOrdersTable extends Migration
{
    public function up()
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->id(); // 主キー
            $table->unsignedBigInteger('customer_id'); // 外部キーを設定するカラム
            $table->foreign('customer_id') // 外部キー制約の設定
                  ->references('id') // 参照先のテーブルのカラム
                  ->on('customers'); // 参照先のテーブル名
            $table->timestamps(); // 作成日時と更新日時
        });
    }

    public function down()
    {
        Schema::dropIfExists('orders');
    }
}

```

#### 外部キー設定についての補足

- `unsignedBigInteger`
外部キーのカラムは、通常、参照先のテーブルの主キーと同じ型にする必要があります。unsignedBigInteger は、一般的に id カラムに使用されます。
- `foreign メソッド`: 外部キー制約を設定するために使用します。このメソッドで、参照先のテーブルとカラムを指定します

- `references メソッド`
どのカラムを参照するかを指定します。
- `on メソッド`
参照先のテーブル名を指定します。


## マイグレーションを適用するコマンド

マイグレーションファイルをデータベースに適用するには、以下のコマンドを実行します。
```bash
php artisan migrate
```
※実行前にはデータベースとの接続が必要です


## マイグレーションの実行後の適用確認

MySQL Workbenchなどを使用して事前に確認できるように接続しておくと便利です

コマンド実行時にエラーが発生する場合は、マイグレーションファイルのコードに誤りがあるか、すでにテーブルが存在するなどが考えられます