[Laravel] テーブル作成手順

# データベース作成
主人公は４人:
- マイグレーションファイル: データベースの作成。どんなカラムがあるかなどの設定も必要。
- モデルファイル: データベースの形状の設定。どんなカラムがあるかなど。
- ファクトリーファイル: ランダムデータ生成項目の設定。何文字かなど。
- シーダーファイル: ランダムデータ生成アクションの設定。いくつのデータを生成するかなど。

## テーブル作成・内容設定編集・適用
作成: `$ sail artisan make:migration create_tag_table`

編集: 
```diff_php:database/migrations/{date}_create_tag_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('tags', function (Blueprint $table) {
            $table->id();
+           $table->string('tag_name');
            $table->timestamps();
        });
    }

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

適用: 
```
$ sail artisan migrate
   INFO  Running migrations.  
   2023_12_04_171640_create_tag_table ............................... 66ms DONE
```

:::note info
適用の巻き戻し:
`$ sail artisan migrate:rollback`
:::


## 必要ファイル作成
作成:
` $ sail artisan make:model {model name} --all`

- オプション: 各ファイルを同時に生成する。
`--migration`、`--factory`、`--seed`、`--controller`、`--all`


```
$ sail artisan make:model tag --migration --controller
   INFO  Model [app/Models/tag.php] created successfully.  
   INFO  Migration [database/migrations/2023_12_04_164729_create_tags_table.php] created successfully.  
   INFO  Controller [app/Http/Controllers/TagController.php] created successfully.  
```

## モデル設定
- Eloquent ORM (Object Relational) Mapper: Laravel で用いられている。コードとデータベースを対にさせる設定。

編集:
```diff_php:app/Models/Tag.php
<?php

namespace App\Models;

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

class tag extends Model
{
    use HasFactory;
+   protected $table = 'tags';
+   protected $primarykey = 'tag_id';  // needed if primary key name != 'id'
}
```

## ファクトリー編集
- Laravel 内のランダムデータの生成設定

編集:
```diff_php:database/factory/TagFactory.php
<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\ag>
 */
class TagFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
+           'tag_name' => $this->faker->realText(100)
        ];
    }
}
```

- config/app.php の 'faker_locale' を 'ja_JP' にすると日本語のランダムデータが生成される設定になる


## シーダー設定
- ファクトリーの適用設定

例
```diff_php:database/seeders/TagSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
+ use App\Models\Tag;

class tag extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
+       Tag::factory()->count(5)->create();
    }
}

```

## ファクトリー・シーダー適用
```
$ sail artisan db:seed --class=TagSeeder
   INFO  Seeding database.  
```

データベースが更新される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556456/bbe0fdd2-a773-3a2a-2daf-5e382927ea95.png)