LaravelでDBのテーブルを作成する（マイグレーション）


# WEBアプリとデータベースの関係性

ブログや会員制サイトのように、ログイン機能や
情報を登録、表示、修正、削除などの操作をするためには
情報を表示するWEBサイトと情報を溜め込むための記憶媒体
データベース（以下、DBと略称）が必要です

DBはレンタルサーバーやローカルサーバーに
配置することができ、管理するためには
MySQLなどのソフトをインストールする必要があります

WEBアプリとは高度な機能を持ったWEBサイトの総称で
youtube,amazon,Facebookなどユーザーによって
操作が可能なサイトもWEBアプリと言えます

## マイグレーションとは

マイグレーションとは古いアプリケーション
（ソフトウェア、データ、通信環境）の資産を
新しい環境へ移行させることを指します

具体的に古いPCから新しいPCに
データを移行させる手順も
マイグレーションと言えます



## Laravelのマイグレーションとは 
マイグレーションファイルという
テーブルの設計図を作成しておき
連携するDBへコマンドで設計図の内容を反映させ
DBにテーブルを作成する方法を指します

## マイグレーションとSQLの違い

SQLはDBへ命令することでテーブルを作成したり
操作することができるプログラミング言語になります

マイグレーションはマイグレーションファイルという
テーブル情報の設計図を作成しコマンドを実行することで
一気にテーブルを作成する手段を指します

SQLと異なるメリットとして
マイグレーションを実行後にはファイルが残るため
履歴管理やロールバック（元の状態に戻す）ことが
でき安全かつ保守性が高い手法になります





## マイグレーションファイルを生成する

次のコマンドを実行することで
Laravelのフレームワークに
マイグレーションファイルの雛形が生成されます
```

① カレントディレクトリをプロジェクトファイルにします

$ cd /Applications/MAMP/htdocs/①*******


② マイグレーションファイルを生成するコマンドを実行します
php artisan make:migration create_②#####_table --create=②#####


-----解説-----

・"①*******"は作成したプロジェクト名を記述します
・"create_②#####_table"は作成したい任意のテーブル名を記述します
・"②#####"は作成したい任意のテーブル名を記述します
・createオプションにテーブル名を追加することで雛形にテーブル名が反映されます


```

## マイグレーションファイルの命名規則

マイグレーションファイルの名前を決める際には
次の命名規則を守りましょう。

### テーブルを新規作成する

#### テーブルの命名規則

|記法|複数or単数|例|
|:---:|:---:|:--:|
|スネークケース|複数形|users / item_tables|

```テーブル命名規則（例1）.
・テーブルを新規で追加するとき

create_tests_table

-----解説-----
・「テーブルを作成する」意味なのでテーブル名の前後に"create"と”table”付与します
・単語をつなぐ際はアンダーラインを用いてスネークケースで繋ぎます

```
```テーブル命名規則（例2）.
$ php artisan make:migration create_tests_table --create=tests

```
---
### 既存のテーブルにカラム（列）を追加する

```カラム追加の命名規則(例1).
add_name_to_tests_table

-----解説-----
・「テーブルにカラム（列）を追加する」意味なので以下をスネークケースで繋ぎます
"add"_”カラム名”_"to”_"テーブル名"_"table"
```

```カラム追加の命名規則(例2).
・カラムを追加するとき
php artisan make:migration add_name_to_tests_table --table=tests

-----解説-----
・tableオプションに"カラム名"を追加する先のテーブル名を記述します

```

### ファイルの生成場所
`database/migrations`





## マイグレーションファイルを編集する

作成された雛形を編集することでテーブルに
追加したいカラム名やデータ型を指定できます

```php
   Schema::create('テーブル名', function (Blueprint $table) {
            $table->bigIncrements('id');
            // 以下のようにカラム（列）を追加する
            $table->string('カラム名');
            $table->text('カラム名');

            $table->timestamps();
        });

 -----解説-----
// ファイル生成の際にオプションを設定するとテーブル名雛形に反映されています
// "id"は主キーのため必須項目であり削除するとエラーが発生します
// bigIncrementsメソッドは、自動増分を示します
// "timestamps"も必須項目であり削除するとエラーが発生します
// "text"や"string"などのデータ型は任意の型を設定します



```

#### 主キーとは
データベースのデータを一意（重複しない値）に識別するための項目のこと
修正、削除、更新の操作で主キーがなければレコードを特定できないため
必ず必要なカラムになります。

### データ型の種類

テーブルのデータ型を指定し、入力されるデータの範囲を指定すれば
誤ったデータがカラムに入力されることを防ぐことができます

|データ型|種類|
|:---:|:---:|
integer|数値（整数）|
decimal|数値（精度の高い小数）|
float|数値（浮動小数）|
string|文字（短い文字列）|
text|文字（長い文字列）|
date|日付|
datetime|日時|
time|時刻|
timestamp|タイムスタンプ|
|binary|バイナリ|
|boolean|真偽|

### timestampで作成日時と更新日時のカラムを作成

$table->timestamps();

追加するカラムに`timestamps`のデータ型を指定すると
データベースのカラムに自動で
`created_at`　と　`updated_at`が作成されます

`timestamps`の引数にはカラム名は必要ありません

## 生成されたマイグレーションファイル

次のようなコマンドでマイグレーションファイルを生成すると
成功すれば次のようなインフォメーションが表示され
マイグレーションファイルが生成されています

```テーブル命名規則（例2）.
$ php artisan make:migration create_tests_table --create=tests

```

![スクリーンショット 2023-04-06 18.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/a9318f23-30d6-cec2-59db-e309944a8708.png)

#### 生成されたマイグレーションファイル

自動で生成した日付などがファイル名の前に付与されます
![スクリーンショット 2023-04-06 18.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/0f396c85-99a9-3837-ba5c-fcd01d2bd539.png)

#### 最初から存在するマイグレーションファイル

migrationsフォルダにはすでにマイグレーションファイルが
存在する場合があります。

LaravelにはWEBアプリの認証機能（ログイン機能）を
自動で作成してくれる機能があります

認証機能を作成するには連携するDBに
`users`テーブルが必要になる他
実装に対して様々なテーブルが必要になるため
存在する既存のマイグレーションファイルは削除せず
まとめて実行しましょう

![スクリーンショット 2023-04-08 23.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/e3456fad-cc4e-a817-534a-09963468389d.png)

## マイグレーションを実行する

`.envファイル`に連携するDBの情報を
上書きすることでマイグレーションを
実行した際に対象のDB名へテーブルが作成されます

`.envファイルは隠しファイル`なので
隠しファイルを見れるよう設定します

「command」＋「shift」＋「.」　（MACの場合）

![スクリーンショット 2023-04-05 10.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/71aaa60e-20d2-ee4b-0962-ac43435105bc.png)


![スクリーンショット 2023-04-07 9.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/0d1caea9-2ff8-27b3-e821-c9c2df1fb068.png)


テスト用に次のようなマイグレーションファイルを
作成しました

![スクリーンショット 2023-04-07 8.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/4fb93b4f-9788-56be-26c6-1e23af455738.png)


```php3:2023_04_06_234954_create_products_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('products', function (Blueprint $table) {
            $table->id();
            $table->string('company_id');
            $table->string('product_name');
            $table->integer('price');
            $table->integer('stock');
            $table->text('comment');
            $table->string('img_path');
            $table->timestamps();
        });
    }

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


```

### マイグレーションの内容を実行する

```:コマンド
$ php artisan migrate
```


上記のコマンドでマイグレーションファイルの内容を
データベースに反映することができます。

![スクリーンショット 2023-04-07 9.06.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/504dd8f3-9020-f531-d348-8ec51619b692.png)

![スクリーンショット 2023-04-07 9.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/3394d8ee-f78f-64c3-022f-ef5fcba86f95.png)


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

マイグレーションを実行したファイルは
マイグレーション済とステータスが記録されるため
再度使用することができません

次のコマンドで確認ができます

※テスト用にマイグレ未実施の
　コピーファイルを配置しています

![スクリーンショット 2023-04-07 9.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/e8facecc-5818-2fae-8a31-1cb1a8f962d2.png)


### マイグレーション済みのファイルを確認する
```
$ php artisan migrate:status
```

すでに実行されている場合は`Ran`
保留中の場合は`Pending`　
になります

![スクリーンショット 2023-04-07 9.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/d09973e2-e574-1662-d625-9459a9416211.png)

### マイグレーションファイルは繰返し使用できない
マイグレーション済になったファイルはファイル内部を
編集してもマイグレーションを再度実行することはできません

マイグレーション済の判断基準は`ファイル名に依存する`ため
ファイル名をリネームするか、新しいマイグレーションファイルを
作成することでマイグレーションを繰返し実行することができます

リネームする場合はファイル名の日付部分を適当に
修正するだけでマイグレーションファイルが
使用可能になります

例
2022_08_09_`******`_create_products_table.php



## マイグレーションを元に戻す（ロールバック）

次のコマンドを実行することで
最後に実行したマイグレーションを
元の状態に戻すことができます

マイグレーションでテーブルを作成していた場合は
テーブルが削除されますので注意してください

ロールバックを実行すると
作成していたマイグレーションが
保留中の状態に戻るため再度
マイグレーションを実行することができますl。
```
$ php artisan migrate:rollback
```

### モデルの命名規則

LaravelでDBを操作するには
モデルと呼ばれるプログラムファイルが必要です

モデルのファイル名を決定する場合は
次の命名規則に従うと綺麗な
プログラムに仕上がります

|記法|複数or単数|例|
|:---:|:---:|:--:|
|アッパーキャメル|単数|UserData|