Laravelで簡単なCMSを作成(データベース作成)

Laravelで簡単なCMSを作ってみます。
環境構築は以下の記事を参考にどうぞ。

https://qiita.com/kiyo27/items/c09273bdae62422fc009

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

テーブル構成・定義は[CakePHPのチュートリアル](https://book.cakephp.org/3/ja/tutorials-and-examples/cms/database.html)で紹介されているものを拝借し、３つテーブルを作成します。Laravelにはマイグレーションというデータベースの管理機能が提供されているので、これを使用します。

https://readouble.com/laravel/8.x/ja/migrations.html

まずは``artisan``コマンドを使用してマイグレーションファイルを生成します。

```bash
php artisan make:migration create_articles_table
php artisan make:migration create_tags_table
php artisan make:migration create_article_tag_table
```

## テーブル定義作成

作成されたマイグレーションファイルに各テーブルの定義を加えていきます。

```php:database/migratations/create_articles_table
<?php

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

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->integer('user_id');
            $table->string('title', 255);
            $table->string('slug', 191);
            $table->text('body');
            $table->boolean('published')->default(false);
            $table->timestamps();
        });
    }

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

```php:database/migratations/create_tags_table
<?php

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

class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('title', 191);
            $table->timestamps();
        });
    }

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

```php:database/migratations/create_article_tag_table
<?php

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

class CreateArticleTagTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('article_tag', function (Blueprint $table) {
            $table->integer('article_id');
            $table->integer('tag_id');
            $table->timestamps();
        });
    }

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

マイグレーションファイルが作成できたら``migrate``Artisanコマンドを実行してデータベースに反映させます。

```
php artisan migrate
```

これだけでテーブルを作成できます。

## おまけ

テーブル作成後にテストデータを追加したい場合は、Laravelの``シーディング``を利用します。

https://readouble.com/laravel/8.x/ja/seeding.html

テストデータとして``users``テーブルにuserを作成してみます。

### シーダーファイルを作成

マイグレーションと同様にartisanコマンドを実行してシーダファイルを作成します。コマンド実行後``database/seeders``にシーダファイルが生成されます。

```
php artisan make:seeder UserSeeder
```

シーダファイルが生成されたら、データ挿入処理を追加します。

```php:database/seeders/UserSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'john',
            'email' => 'john@gmail.com',
            'password' => Hash::make('MyPassword'),
        ]);

        DB::table('users')->insert([
            'name' => 'jack',
            'email' => 'jack@gmail.com',
            'password' => Hash::make('MyPassword'),
        ]);
    }
}
```

### シーダの呼び出し

artisanコマンドを使用して個別にシーダファイルを実行することができますが、``DatabaseSeeder``クラスの``call``メソッドにシードクラスを登録することで、シーダファイルが複数になっても一括で実行できるようになります。

```php:database/seeders/DatabaseSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // \App\Models\User::factory(10)->create();
        $this->call([
            UserSeeder::class,
        ]);
    }
}
```

### シーダの実行

``db:seed`` Artisanコマンドで``Database\Seeders\DatabaseSeeder``クラスを呼び出しシーディングを実行します。これによりテストデータが登録できます。

```
php artisan db:seed
```

テーブルの中身を確認したいとき、vscodeの拡張機能を使用すれば簡単にテーブルデータを確認することができます。

https://qiita.com/kiyo27/items/d6c762a2a18cf719d02d