import{_ as i,o as a,c as t,a2 as h}from"./chunks/framework.BbmSSMjL.js";const E=JSON.parse('{"title":"3.2 数据库建表","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/database.md","filePath":"zh/guide/database.md"}'),k={name:"zh/guide/database.md"};function n(l,s,e,p,d,F){return a(),t("div",null,[...s[0]||(s[0]=[h(`
概述
建表是模块开发的第一步。所有表必须包含公共字段(id、软删除、审计字段),这是模型 Trait 自动处理的基础。
所有业务表必须包含以下公共字段:
-- 公共字段(每个表都必须包含)
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
is_delete TINYINT(1) DEFAULT 0 COMMENT '软删除 0=正常 1=已删除',
create_user VARCHAR(50) DEFAULT '' COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_user VARCHAR(50) DEFAULT '' COMMENT '更新人',
update_time DATETIME COMMENT '更新时间'为什么必须包含这些字段?
is_delete:SoftDeleteFlagScope 全局查询范围会自动过滤 is_delete=1 的数据(SoftDeletesByFlag Trait 注册)create_user / create_time:HasAuditColumns Trait 的 creating 事件自动填充update_user / update_time:HasAuditColumns Trait 的 updating 事件自动填充created_at / updated_at 列,统一使用本项目的审计字段命名document/mysql/ 实际脚本) CREATE TABLE laravel_example (
-- 主键
id INT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
-- 业务字段
name VARCHAR(255) NOT NULL COMMENT '案例名称',
avatar VARCHAR(255) NULL DEFAULT NULL COMMENT '案例图片',
type INT NULL DEFAULT 0 COMMENT '案例类型:1-类型1 2-类型2 3-类型3 4-类型4',
status INT NULL DEFAULT 0 COMMENT '案例状态:1-在用 2-停用',
sort INT NULL DEFAULT 0 COMMENT '案例排序',
-- 公共字段(必须)
create_user VARCHAR(50) NULL DEFAULT NULL COMMENT '创建人',
create_time DATETIME NULL DEFAULT (now()) COMMENT '创建时间',
update_user VARCHAR(50) NULL DEFAULT NULL COMMENT '更新人',
update_time DATETIME NULL DEFAULT (now()) COMMENT '更新时间',
is_delete INT NULL DEFAULT 0 COMMENT '删除标识:0-正常 1-已删除',
-- 索引
PRIMARY KEY (id),
INDEX idx_think_level_is_delete (is_delete),
INDEX idx_think_level_name (name),
INDEX idx_think_level_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='案例演示表';枚举注释写法
枚举字段的注释直接写成 1-在用 2-停用 格式,代码生成器据此自动解析选项(见 10.4 表结构解析引擎)。
表前缀
建表 SQL 中的表名含 laravel_ 前缀(与 .env 中 DB_PREFIX 一致);模型层的 $table 只写不含前缀的 example,查询时由 Laravel 自动拼接前缀。
(对照 app/Services/ExampleService.php 实际声明)
| 数据库字段 | 类型 | Service 属性 | 说明 |
|---|---|---|---|
name | VARCHAR(255) | pageLikeFields + uniqueFields | LIKE 模糊搜索 + 名称唯一校验 |
status | INT | pageEqFields + serializeMaps | 精确匹配 + 字典翻译(example_status → 补 statusText) |
type | INT | —(普通表单/列表字段) | 注释含选项,前端按 columns.ts 渲染 |
sort | INT | —(默认排序用基类 pageOrderBy) | 排序值 |
avatar | VARCHAR(255) | —(前端 UploadImg 直传) | 图片路径字段 |
| 检查项 | 说明 |
|---|---|
| 公共字段齐全 | id / is_delete / 四个审计字段 |
| 字段小写下划线 | category_id、create_time |
| 枚举字段配字典 | 字段注释写明字典编码,便于生成器提取 |
| 模糊搜索字段建索引 | LIKE 查询字段建议加索引 |
| 需要唯一性的字段 | 在 Service 配置 uniqueFields(不是数据库唯一索引,软删除场景更安全) |
| 用途 | 推荐类型 | 示例 |
|---|---|---|
| 主键 | INT AUTO_INCREMENT | id INT PRIMARY KEY AUTO_INCREMENT |
| 外键 | INT DEFAULT 0 | category_id INT DEFAULT 0 |
| 短文本 | VARCHAR(n) | name VARCHAR(200) |
| 长文本 | TEXT | content TEXT |
| 布尔值 | TINYINT(1) | status TINYINT(1) DEFAULT 1 |
| 整数 | INT | sort INT DEFAULT 0 |
| 日期时间 | DATETIME | create_time DATETIME |
| 文件路径 | VARCHAR(500) | avatar VARCHAR(500) |
TIP
本项目 database/migrations/ 为空,建表后直接执行 SQL(或在已有数据库上 ALTER TABLE),无需迁移。多数据库脚本见 2.5 数据库初始化。