CMS 教程 - 创建数据库

现在我们已经安装了 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

将上面的种子数据填充到新的 UsersSeedArticlesSeed 类中,然后

bin/cake migrations seed

阅读有关构建迁移和数据种子的更多信息:迁移

数据库建立后,我们现在可以构建 模型