CakePHP4で簡易ブログサイトを作ってみるコーナーです。
318 views
ブログのデータベースを作成するための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/