ThinkPHP数据库设计必须严格遵循约定:表名加统一前缀、字段全小写下划线、主键id、布尔字段以is_/has_/exist_/can_开头;所有实体表强制含id、status、time、del_time、remark五字段;存储引擎必为InnoDB,字符集必为utf8mb4。

ThinkPHP 项目里数据库设计不是“能用就行”,而是必须按约定来——不加 status、time、del_time 字段,回收站和软删除直接失效;表名没前缀或大小写混用,模型查不到数据是常态。
为什么 new User() 查不到数据?模型加载链断了
90% 的“查不到”不是 SQL 写错,是自动加载没对上:
- 类名
User→ 文件必须叫User.php(不能是user.php或UserModel.php) - 命名空间必须是
app\model(小写model,不是Model或appModel) - 路径必须是
app/model/User.php(Linux 风格正斜杠,Windows 下也不能用反斜杠) - 控制器里必须写
use app\model\User;,漏掉就当成当前命名空间下的类找 - 文件不能带 BOM 头(尤其 Windows 编辑器保存时容易带),否则
composer dump-autoload也救不了
表名和字段名怎么命名才不踩坑?
ThinkPHP 默认靠驼峰转下划线推导表名,但前提是你守规矩:
- 模型类
UserProfile→ 自动对应表user_profile,不是userprofile或userProfile - 所有表必须加统一前缀,如
ithink_;自己开发的模块再加二级前缀,如ithink_blog_ - 字段名全小写 + 下划线,禁止拼音、缩写歧义词(
usr、addtime不允许) - 主键固定用
id,用户外键统一叫user_id,父级 ID 统一叫pid - 布尔型字段必须以
is_、has_、exist_或can_开头,如is_new、has_avatar
哪些字段是强制要加的?少一个就功能异常
所有实体表(非中间表、非配置表)必须包含以下字段,否则基础功能会出问题:
立即学习“PHP免费学习笔记(深入)”;
-
id:INT UNSIGNED AUTO_INCREMENT,主键 -
status:TINYINT NOT NULL DEFAULT 0,0=回收站,1=正常,2=禁用 -
time:INT NOT NULL DEFAULT 0,记录添加时间戳 -
del_time:INT NOT NULL DEFAULT 0,软删除时间戳 -
remark:TEXT NOT NULL,备注字段,系统已集成stripslashes/htmlentities/htmlspecialchars处理
中间表(如 ithink_user_role、ithink_role_privilege)不用加这些字段。
字符集、引擎、索引这些底层细节不能妥协
不是“选一个能用的”,而是硬性要求:
- 存储引擎必须用
InnoDB(MyISAM 不支持事务,CURD 封装会直接崩) - 字符集必须是
utf8mb4,校对规则必须是utf8mb4_general_ci(emoji 和多语言支持的基础) - 时间字段统一用
INT存时间戳,不用DATETIME或TIMESTAMP(避免时区和自动更新干扰) - 枚举值必须用整型(
TINYINT优先),比如性别:0=保密,1=男,2=女 - 单索引字段数 ≤ 5 个;低区分度字段(如
gender)禁止单独建索引
最常被忽略的是 del_time 字段的默认值——设成 NULL 或留空,软删除逻辑就断在第一步。



















