CakePHP4でブログサイトを作ってみよう

CakePHP4で簡易ブログサイトを作ってみるコーナーです。

318 views

SQL

ブログのデータベースを作成するためのSQLを以下に記す。

-- ユーザ管理テーブル
CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username VARCHAR(255) UNIQUE NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  password VARCHAR(255) NOT NULL,
  display_name VARCHAR(255),
  bio TEXT,
  profile_image VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  last_login TIMESTAMP
);

-- 記事テーブル
CREATE TABLE posts (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id INTEGER NOT NULL,
  title VARCHAR(255) NOT NULL,
  content TEXT NOT NULL,
  slug VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  published_at TIMESTAMP,
  status VARCHAR(255) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users (id)
);

-- カテゴリテーブル
CREATE TABLE categories (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(255) NOT NULL,
  slug VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);


-- 記事とカテゴリの関連テーブル
CREATE TABLE post_categories (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  post_id INTEGER NOT NULL,
  category_id INTEGER NOT NULL,
  FOREIGN KEY (post_id) REFERENCES posts (id),
  FOREIGN KEY (category_id) REFERENCES categories (id)
);

-- コメントテーブル
CREATE TABLE comments (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id INTEGER NOT NULL,
  post_id INTEGER NOT NULL,
  content TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  status VARCHAR(255) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users (id),
  FOREIGN KEY (post_id) REFERENCES posts (id)
);

-- タグテーブル
CREATE TABLE tags (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(255) NOT NULL,
  slug VARCHAR(255) UNIQUE NOT NULL
);

-- 記事とタグ関連テーブル
CREATE TABLE post_tags (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  post_id INTEGER NOT NULL,
  tag_id INTEGER NOT NULL,
  FOREIGN KEY (post_id) REFERENCES posts (id),
  FOREIGN KEY (tag_id) REFERENCES tags (id)
);

マイグレーション

CakePHP4でデータベースを生成するためのマイグレーションについて説明する。
まず、以下のコマンドを実行する。
ただし、バージョン管理に時間を用いているため、1秒以上間隔を開けて実行すること。

bin\cake bake migration CreateUsers
bin\cake bake migration CreatePosts
bin\cake bake migration CreateCategories
bin\cake bake migration CreatePostCategories
bin\cake bake migration CreateComments
bin\cake bake migration CreateTags
bin\cake bake migration CreatePostTags

各ファイルに以下を記述する。
CreateUsers マイグレーションファイル

public function change()
{
    $table = $this->table('users');
    $table->addColumn('username', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('email', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('password', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('display_name', 'string', ['limit' => 255, 'null' => true])
          ->addColumn('bio', 'text', ['null' => true])
          ->addColumn('profile_image', 'string', ['limit' => 255, 'null' => true])
          ->addColumn('created_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('updated_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('last_login', 'datetime', ['null' => true])
          ->addIndex(['username', 'email'], ['unique' => true])
          ->create();
}

CreatePostsマイグレーションファイル

public function change()
{
    $table = $this->table('posts');
    $table->addColumn('user_id', 'integer', ['null' => false])
          ->addColumn('title', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('content', 'text', ['null' => false])
          ->addColumn('slug', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('created_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('updated_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('published_at', 'datetime', ['null' => true])
          ->addColumn('status', 'string', ['limit' => 255, 'null' => false])
          ->addIndex(['slug'], ['unique' => true])
          ->addForeignKey('user_id', 'users', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
          ->create();
}

CreatePostCategoriesマイグレーションファイル

public function change(): void
{
        $table = $this->table('post_categories');
        $table->addColumn('post_id', 'integer', ['null' => false])
                    ->addColumn('category_id', 'integer', ['null' => false])
                    ->addForeignKey('post_id', 'posts', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
                    ->addForeignKey('category_id', 'categories', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
                    ->create();
}

CreateCategoriesマイグレーションファイル

public function change()
{
    $table = $this->table('categories');
    $table->addColumn('name', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('slug', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('created_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('updated_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addIndex(['slug'], ['unique' => true])
          ->create();
}

CreateCommentsマイグレーションファイル

public function change()
{
    $table = $this->table('comments');
    $table->addColumn('user_id', 'integer', ['null' => false])
          ->addColumn('post_id', 'integer', ['null' => false])
          ->addColumn('content', 'text', ['null' => false])
          ->addColumn('created_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('updated_at', 'datetime', ['null' => false, 'default' => 'CURRENT_TIMESTAMP'])
          ->addColumn('status', 'string', ['limit' => 255, 'null' => false])
          ->addForeignKey('user_id', 'users', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
          ->addForeignKey('post_id', 'posts', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
          ->create();
}

CreateTagsマイグレーションファイル

public function change()
{
    $table = $this->table('tags');
    $table->addColumn('name', 'string', ['limit' => 255, 'null' => false])
          ->addColumn('slug', 'string', ['limit' => 255, 'null' => false])
          ->addIndex(['slug'], ['unique' => true])
          ->create();
}

CreatePostTagsマイグレーションファイル

public function change()
{
    $table = $this->table('post_tags');
    $table->addColumn('post_id', 'integer', ['null' => false])
          ->addColumn('tag_id', 'integer', ['null' => false])
          ->addForeignKey('post_id', 'posts', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
          ->addForeignKey('tag_id', 'tags', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
          ->create();
}

作成したら、以下のコマンドを実行する。

bin\cake migrations migrate

Page 15 of 15.

前のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626