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
('cakephp@example.com', '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
('cakephp@example.com', '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
return [
    // 更多配置...
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            // 如果您使用的是PostgreSQL,请将Mysql替换为Postgres
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => 'cakephp',
            'password' => 'AngelF00dC4k3~',
            'database' => 'cake_cms',
            // 如果您使用的是PostgreSQL,请注释掉下面的行
            'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
        ],
    ],
    // 更多配置...
];

保存 config/app.php 文件后,您应该看到“CakePHP能够连接到数据库”部分显示为绿色的厨师帽。

Note

如果您的app文件夹中有 config/app_local.php 文件,则需要在该文件中配置数据库连接。

创建我们的第一个模型

模型是CakePHP应用程序的核心。它们使我们能够读取和修改数据,构建数据之间的关系,验证数据并应用应用程序规则。模型提供了创建控制器操作和模板所需的基础。

CakePHP的模型由 TableEntity 对象组成。 Table 对象提供对特定表中存储的实体集合的访问。它们存储在 src/Model/Table 目录中。我们将创建的文件将保存在 src/Model/Table/ArticlesTable.php 中。完成的文件应如下所示:

<?php
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;

use Cake\ORM\Table;

class ArticlesTable extends Table
{
    public function initialize(array $config): void
    {
        $this->addBehavior('Timestamp');
    }
}

我们附加了 Timestamp 行为,它将自动填充我们表的 createdmodified 列。通过将我们的Table对象命名为 ArticlesTable ,CakePHP可以使用命名约定,知道我们的模型使用 articles 表。CakePHP还使用约定知道 id 列是我们表的主键。

Note

如果CakePHP在 src/Model/Table 中找不到相应的文件,它将动态创建一个模型对象。这也意味着如果您错误地命名了文件(例如articlestable.php或ArticleTable.php),CakePHP将无法识别您的任何设置,并使用生成的模型。

我们还将为我们的Articles创建一个Entity类。实体表示数据库中的单个记录,并为我们的数据提供行级行为。我们的实体将保存在 src/Model/Entity/Article.php 中。完成的文件应如下所示:

<?php
// src/Model/Entity/Article.php
namespace App\Model\Entity;

use Cake\ORM\Entity;

class Article extends Entity
{
    protected array $_accessible = [
        '*' => true,
        'id' => false,
        'slug' => false,
    ];
}

目前,我们的实体非常简单;我们只设置了 _accessible 属性,它控制了如何通过 Mass Assignment 修改属性。

我们目前无法对模型进行太多操作。接下来,我们将创建我们的第一个 Controller和Template,以便与我们的模型进行交互。