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ファイルそれぞれで、MigratingとMigratedが表示され、テーブルが作成されます。
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)をサンプルにします。
- 論理削除のため、SoftDeletesを追加
- 主キーのカラム名を追加
- INSERTやUPDATE時に、入力値を保存するカラムを指定
- 日時関係のカラムを指定
<?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'];
}
2022-04-18 09:00:00
