Ikeda's Blog

Laravelでブログサイトを作る 08. テーブル生成

設計について

設計はデータベース定義にて行っております。
これを、migrationに落とし込み、テーブルを作成します。
Laravelのmigrationについてはコチラを参考に。

親カテゴリmigrationファイル

createするテーブルのカラムについては、upメソッド内で設定します。
主キーを、デフォルトの$table->id();ではなく、increments('id')としています。
これは、$table->id()を使ってしまうと、BIGINT型になってしまうからです。
BIGINTの方が大量の上限値が上ですが、符号ありで考えても
INT型:約21億
BIGINT型:約922京(1000兆の922倍)
なので、個人運営サイトでわざわざBIGINTにするほどではないかなぁ、という考えです。
(とはいえ、ギリギリを詰めなければならない状況でもないので、MEDIUMINT型にもしていません)

対象ファイル:database/migrations/XXXX_XX_XX_XXXXXX_create_parent_categories_table.php

// ...省略...
    public function up()
    {
        Schema::create('parents', function (Blueprint $table) {
            $table->increments('id'); // 主キー(自動採番のINT型)
            $table->text('name'); // カテゴリ名
            $table->integer('number')->index(); // 表示順
            $table->softDeletes(); // ソフトデリートのためにNULL値可能なdeleted_at TIMESTAMPカラム追加
            $table->timestamps(); // NULL値可能なcreated_atとupdated_atカラム追加
        });
    }
// ...省略...

子カテゴリmigrationファイル

対象ファイル:database/migrations/XXXX_XX_XX_XXXXXX_create_child_categories_table.php

// ...省略...
    public function up()
    {
        Schema::create('parents', function (Blueprint $table) {
            $table->increments('id'); // 主キー(自動採番のINT型)
            $table->text('name'); // 子カテゴリ名
            $table->integer('number')->index(); // 表示順
            $table->integer('parent'); // 親カテゴリID
            $table->softDeletes(); // ソフトデリートのためにNULL値可能なdeleted_at TIMESTAMPカラム追加
            $table->timestamps(); // NULL値可能なcreated_atとupdated_atカラム追加
        });
    }
// ...省略...

記事migrationファイル

対象ファイル:database/migrations/XXXX_XX_XX_XXXXXX_create_articles_table.php

// ...省略...

public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id'); // 主キー(自動採番のINT型)
            $table->text('title'); // 記事タイトル
            $table->text('body'); // 本文
            $table->integer('parent')->index(); // 親カテゴリID
            $table->softDeletes(); // ソフトデリートのためにNULL値可能なdeleted_at TIMESTAMPカラム追加
            $table->timestamps(); // NULL値可能なcreated_atとupdated_atカラム追加

        });
    }

// ...省略...

記事-子カテゴリmigrationファイル

対象ファイル:database/migrations/XXXX_XX_XX_XXXXXX_create_article_children_table.php

// ...省略...
    public function up()
    {
        Schema::create('parents', function (Blueprint $table) {
            $table->increments('id'); // 主キー(自動採番のINT型)
            $table->integer('article')->index(); // 符記事ID
            $table->integer('children')->index(); // 子カテゴリID
            $table->softDeletes(); // ソフトデリートのためにNULL値可能なdeleted_at TIMESTAMPカラム追加
            $table->timestamps(); // NULL値可能なcreated_atとupdated_atカラム追加
        });
    }
// ...省略...

テーブル作成

サーバに接続し、以下のコマンドを実行します。

$ php artisan migrate

先述の4ファイルそれぞれで、MigratingMigratedが表示され、テーブルが作成されます。
MySQLでテーブル一覧を表示すると、作成されていることが確認できます。

$ mysql -u root -p
Enter password: [コメント]設定したパスワードを入力(過去記事では`NEW_pass_123`を設定)

mysql> use blog
mysql> show tables;
+------------------------+
| Tables_in_blog         |
+------------------------+
| article_children       |
| articles               |
| children               |
| failed_jobs            |
| migrations             |
| parents                |
| password_resets        |
| personal_access_tokens |
| sessions               |
| team_invitations       |
| team_user              |
| teams                  |
| users                  |
+------------------------+
13 rows in set (0.00 sec)

Modelの編集

app/Models以下にあるファイルを、テーブルの構成に合わせて編集します。
記事(Article.php)をサンプルにします。

  1. 論理削除のため、SoftDeletesを追加
  2. 主キーのカラム名を追加
  3. INSERTやUPDATE時に、入力値を保存するカラムを指定
  4. 日時関係のカラムを指定
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; // 【追加】1.論理削除用

class Article extends Model
{
    use HasFactory;
    use SoftDeletes; // 【追加】1.論理削除用

    // 【追加】2.主キー
    protected $primaryKey = 'id';

    // 【追加】3.入力値用カラム指定
    protected $fillable = ['title', 'body', 'parent'];

    // 【追加】2.日時系カラム
    protected $dates = ['created_at', 'updated_at', 'deleted_at'];
}