现在我们已经安装了 CakePHP,让我们为我们的 CMS 应用程序设置数据库。如果你还没有这样做,请创建一个空的数据库,用于本教程,并使用你选择的名称,例如 cake_cms
。如果你使用的是 MySQL/MariaDB,你可以执行以下 SQL 语句来创建必要的表
CREATE DATABASE cake_cms;
USE cake_cms;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created DATETIME,
modified DATETIME
);
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(191) NOT NULL,
body TEXT,
published BOOLEAN DEFAULT FALSE,
created DATETIME,
modified DATETIME,
UNIQUE KEY (slug),
FOREIGN KEY user_key (user_id) REFERENCES users(id)
) CHARSET=utf8mb4;
CREATE TABLE tags (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(191),
created DATETIME,
modified DATETIME,
UNIQUE KEY (title)
) CHARSET=utf8mb4;
CREATE TABLE articles_tags (
article_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (article_id, tag_id),
FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
FOREIGN KEY article_key(article_id) REFERENCES articles(id)
);
INSERT INTO users (email, password, created, modified)
VALUES
('[email protected]', 'secret', NOW(), NOW());
INSERT INTO articles (user_id, title, slug, body, published, created, modified)
VALUES
(1, 'First Post', 'first-post', 'This is the first post.', 1, NOW(), NOW());
如果你使用的是 PostgreSQL,请连接到 cake_cms
数据库并执行以下 SQL 语句
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created TIMESTAMP,
modified TIMESTAMP
);
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(191) NOT NULL,
body TEXT,
published BOOLEAN DEFAULT FALSE,
created TIMESTAMP,
modified TIMESTAMP,
UNIQUE (slug),
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE tags (
id SERIAL PRIMARY KEY,
title VARCHAR(191),
created TIMESTAMP,
modified TIMESTAMP,
UNIQUE (title)
);
CREATE TABLE articles_tags (
article_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (article_id, tag_id),
FOREIGN KEY (tag_id) REFERENCES tags(id),
FOREIGN KEY (article_id) REFERENCES articles(id)
);
INSERT INTO users (email, password, created, modified)
VALUES
('[email protected]', 'secret', NOW(), NOW());
INSERT INTO articles (user_id, title, slug, body, published, created, modified)
VALUES
(1, 'First Post', 'first-post', 'This is the first post.', TRUE, NOW(), NOW());
你可能已经注意到 articles_tags
表使用了复合主键。CakePHP 几乎在所有地方都支持复合主键,允许你拥有更简单的模式,而不需要额外的 id
列。
我们使用的表名和列名不是随意的。通过使用 CakePHP 的 命名规范,我们可以更有效地利用 CakePHP 并避免需要配置框架。虽然 CakePHP 足够灵活,可以适应几乎任何数据库模式,但遵循规范将节省你的时间,因为你可以利用 CakePHP 提供的基于规范的默认值。
接下来,让我们告诉 CakePHP 我们的数据库在哪里以及如何连接到它。在你的 config/app_local.php 文件中,用适用于你的设置的值替换 Datasources.default
数组中的值。一个完成的示例配置数组可能如下所示
<?php
// config/app_local.php
return [
// More configuration above.
'Datasources' => [
'default' => [
'host' => 'localhost',
'username' => 'cakephp',
'password' => 'AngelF00dC4k3~',
'database' => 'cake_cms',
'url' => env('DATABASE_URL', null),
],
],
// More configuration below.
];
保存 config/app_local.php 文件后,你应该看到“CakePHP 能够连接到数据库”部分有一个绿色的厨师帽。
注意
文件 config/app_local.php 是文件 config/app.php 的本地覆盖,用于快速配置你的开发环境。
用于创建本教程表的 SQL 语句也可以使用迁移插件生成。迁移提供了一种平台无关的方式来运行查询,因此 MySQL、PostgreSQL、SQLite 等之间的细微差别不会成为障碍。
bin/cake bake migration CreateUsers email:string password:string created modified
bin/cake bake migration CreateArticles user_id:integer title:string slug:string[191]:unique body:text published:boolean created modified
bin/cake bake migration CreateTags title:string[191]:unique created modified
bin/cake bake migration CreateArticlesTags article_id:integer:primary tag_id:integer:primary created modified
注意
对生成的代码可能需要进行一些调整。例如,articles_tags
上的复合主键将设置为两个列都自动递增
$table->addColumn('article_id', 'integer', [
'autoIncrement' => true,
'default' => null,
'limit' => 11,
'null' => false,
]);
$table->addColumn('tag_id', 'integer', [
'autoIncrement' => true,
'default' => null,
'limit' => 11,
'null' => false,
]);
删除这些行以防止外键问题。调整完成后
bin/cake migrations migrate
同样,启动数据记录可以使用种子完成。
bin/cake bake seed Users
bin/cake bake seed Articles
将上面的种子数据填充到新的 UsersSeed
和 ArticlesSeed
类中,然后
bin/cake migrations seed
阅读有关构建迁移和数据种子的更多信息:迁移
数据库建立后,我们现在可以构建 模型。