# 4.9 数据库设计 :::tip 概述 项目支持 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 五种数据库,通过 `.env` 的 `DATABASE.TYPE` 一键切换。所有数据库共用同一套代码,无需修改业务逻辑。本章涵盖命名规范、表结构设计、字段说明、索引策略和多数据库适配。 ::: ## 命名规范 | 对象 | 规范 | 示例 | |------|------|------| | 表名 | `think_` 前缀 + 小写下划线 | `think_user`、`think_article` | | 字段名 | 小写下划线 | `create_time`、`user_name` | | 主键 | 统一 `id`,INT 自增 | `id INT PRIMARY KEY` | | 外键 | `表名_id` | `user_id`、`role_id` | | 索引 | `idx_字段名` | `idx_status`、`idx_tenant_id` | | 唯一索引 | `uk_字段名` | `uk_username` | ## 公共字段 所有业务表**必须**包含以下公共字段,由 `BaseModel` 自动维护: ```sql -- MySQL 格式 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` | BaseModel 软删除机制 | `softDelete()` 设置为 1,全局查询范围自动过滤 | | `create_user` | BaseModel `onBeforeInsert` | 取当前登录用户名,无用户时留空 | | `create_time` | BaseModel `onBeforeInsert` | 取当前时间,已传入则不覆盖 | | `update_user` | BaseModel `onBeforeUpdate` | 取当前登录用户名 | | `update_time` | BaseModel `onBeforeUpdate` | 始终覆盖为当前时间 | ## 核心表清单 ### 用户与权限(6 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_user` | 用户表 | BaseTenantLogic | | `think_user_role` | 用户角色关联表(N:N 中间表) | — | | `think_role` | 角色表 | BaseLogic | | `think_role_menu` | 角色菜单关联表(N:N 中间表) | — | | `think_menu` | 菜单/权限表 | BaseLogic | | `think_dept` | 部门表(树形) | BaseTenantLogic | **关联关系:** ```text think_user ──┐ │ N:N (think_user_role) think_role ──┤ │ N:N (think_role_menu) think_menu ──┘ think_dept ←── think_user.dept_id think_tenant ←── think_user.tenant_id ``` ### 组织架构(3 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_dept` | 部门表(树形,parent_id) | BaseTenantLogic | | `think_position` | 岗位表 | BaseTenantLogic | | `think_level` | 职级表 | BaseTenantLogic | ### 租户(1 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_tenant` | 租户表 | BaseLogic | ### 系统配置(5 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_dict` | 字典表 | BaseLogic | | `think_dict_item` | 字典项表 | BaseLogic | | `think_config` | 配置组表 | BaseLogic | | `think_config_item` | 配置项表 | BaseLogic | | `think_param` | 系统参数表 | BaseLogic | **关联关系:** ```text think_dict ←── think_dict_item.dict_id think_config ←── think_config_item.config_id ``` ### 内容管理(4 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_article` | 文章表 | BaseTenantLogic | | `think_category` | 文章分类表(树形) | BaseTenantLogic | | `think_link` | 友情链接表 | BaseTenantLogic | | `think_notice` | 通知公告表 | BaseTenantLogic | ### 日志审计(2 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_login_log` | 登录日志表 | BaseLogic | | `think_operation_log` | 操作日志表 | BaseLogic | ### 定时任务(2 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_job` | 定时任务表 | BaseLogic | | `think_job_log` | 定时任务执行日志表 | BaseLogic | **关联关系:** ```text think_job ←── think_job_log.job_id ``` ### 基础数据(2 张表) | 表名 | 说明 | Logic 基类 | |------|------|-----------| | `think_city` | 城市行政区划表(树形,pid) | BaseLogic | | `think_file_template` | 文件模板表 | BaseLogic | **共计 25 张业务表**(不含中间表)。 ## 关键表字段说明 ### think_user(用户表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | INT | 主键 | | `username` | VARCHAR(50) | 用户名(登录账号) | | `password` | VARCHAR(255) | 密码(bcrypt 加密) | | `salt` | VARCHAR(50) | 密码盐值 | | `realname` | VARCHAR(50) | 姓名 | | `gender` | TINYINT | 性别(字典 gender) | | `mobile` | VARCHAR(20) | 手机号 | | `email` | VARCHAR(100) | 邮箱 | | `avatar` | VARCHAR(500) | 头像路径 | | `status` | TINYINT | 状态(字典 user_status) | | `dept_id` | INT | 部门 ID | | `level_id` | INT | 职级 ID | | `position_id` | INT | 岗位 ID | | `tenant_id` | INT | 租户 ID | | `province_code` | VARCHAR(20) | 省编码 | | `city_code` | VARCHAR(20) | 市编码 | | `district_code` | VARCHAR(20) | 区编码 | | `street_code` | VARCHAR(20) | 街道编码 | | `city_info` | VARCHAR(200) | 城市名称拼接 | | `is_delete` | TINYINT(1) | 软删除 | | `create_user` | VARCHAR(50) | 创建人 | | `create_time` | DATETIME | 创建时间 | | `update_user` | VARCHAR(50) | 更新人 | | `update_time` | DATETIME | 更新时间 | ### think_role(角色表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | INT | 主键 | | `name` | VARCHAR(50) | 角色名称 | | `code` | VARCHAR(50) | 角色编码 | | `data_scope` | TINYINT | 数据权限范围:1=全部 2=本部门 3=仅本人 | | `status` | TINYINT | 状态 | | `remark` | VARCHAR(500) | 备注 | | `sort` | INT | 排序 | | `...` | | 公共字段 | ### think_menu(菜单/权限表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | INT | 主键 | | `parent_id` | INT | 父级 ID(0=顶级) | | `name` | VARCHAR(50) | 菜单名称 | | `permission` | VARCHAR(100) | 权限标识(如 `sys:user:add`) | | `type` | TINYINT | 类型:0=目录 1=菜单 2=按钮 | | `path` | VARCHAR(200) | 路由路径 | | `icon` | VARCHAR(100) | 图标 | | `sort` | INT | 排序 | | `status` | TINYINT | 状态 | | `remark` | VARCHAR(500) | 备注 | | `...` | | 公共字段 | ### think_tenant(租户表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | INT | 主键 | | `name` | VARCHAR(100) | 租户名称 | | `code` | VARCHAR(50) | 租户编码(系统自动生成:T+4位ID) | | `status` | TINYINT | 状态(字典 tenant_status):0=禁用 1=启用 | | `expire_time` | DATETIME | 过期时间 | | `max_user_num` | INT | 最大用户数限制 | | `contact_name` | VARCHAR(50) | 联系人 | | `contact_phone` | VARCHAR(20) | 联系电话 | | `remark` | VARCHAR(500) | 备注 | | `...` | | 公共字段 | ### think_article(文章表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | INT | 主键 | | `title` | VARCHAR(200) | 标题 | | `category_id` | INT | 分类 ID | | `cover` | VARCHAR(500) | 封面图路径 | | `content` | TEXT | 内容(富文本,含 [IMG_URL] 占位符) | | `author` | VARCHAR(50) | 作者 | | `status` | TINYINT | 状态(字典 article_status):0=正常 1=下架 | | `sort` | INT | 排序 | | `tenant_id` | INT | 租户 ID | | `...` | | 公共字段 | ## 索引策略 ### 推荐索引 ```sql -- 用户表:高频查询字段 ALTER TABLE think_user ADD INDEX idx_username (username); ALTER TABLE think_user ADD INDEX idx_tenant_id (tenant_id); ALTER TABLE think_user ADD INDEX idx_dept_id (dept_id); ALTER TABLE think_user ADD INDEX idx_status (status); -- 角色关联表:外键索引 ALTER TABLE think_user_role ADD INDEX idx_user_id (user_id); ALTER TABLE think_user_role ADD INDEX idx_role_id (role_id); ALTER TABLE think_role_menu ADD INDEX idx_role_id (role_id); ALTER TABLE think_role_menu ADD INDEX idx_menu_id (menu_id); -- 文章表:常用过滤字段 ALTER TABLE think_article ADD INDEX idx_category_id (category_id); ALTER TABLE think_article ADD INDEX idx_status (status); ALTER TABLE think_article ADD INDEX idx_tenant_id (tenant_id); -- 日志表:按时间查询 ALTER TABLE think_login_log ADD INDEX idx_create_time (create_time); ALTER TABLE think_operation_log ADD INDEX idx_create_time (create_time); ALTER TABLE think_job_log ADD INDEX idx_job_id (job_id); -- 菜单表:树形查询 ALTER TABLE think_menu ADD INDEX idx_parent_id (parent_id); -- 字典项表:按字典 ID 查询 ALTER TABLE think_dict_item ADD INDEX idx_dict_id (dict_id); ALTER TABLE think_config_item ADD INDEX idx_config_id (config_id); -- 城市表:按编码查询 ALTER TABLE think_city ADD INDEX idx_area_code (area_code); ALTER TABLE think_city ADD INDEX idx_parent_code (parent_code); ALTER TABLE think_city ADD INDEX idx_pid (pid); ``` ### 索引设计原则 | 原则 | 说明 | |------|------| | 外键必加 | 所有 `_id` 外键字段都应加索引 | | 过滤字段 | `pageEqFields` 中配置的精确匹配字段应加索引 | | 模糊搜索 | `pageLikeFields` 中的字段可考虑全文索引,但 LIKE '%xx%' 无法用普通索引 | | 排序字段 | `pageOrderBy` 中的默认排序字段可加索引 | | 时间字段 | 日志表的 `create_time` 必加索引(按时间范围查询) | ## 多数据库支持 ### 支持的数据库 | 数据库 | type 值 | 默认端口 | 默认用户 | PHP 扩展 | |--------|---------|----------|----------|----------| | MySQL | `mysql` | 3306 | root | `pdo_mysql` | | PostgreSQL | `pgsql` | 5432 | postgres | `pdo_pgsql` | | SQL Server | `sqlsrv` | 1433 | sa | `pdo_sqlsrv` | | Oracle | `oracle` | 1521 | - | `pdo_oci` | | SQLite | `sqlite` | - | - | `pdo_sqlite` | ### 切换数据库 只需修改 `.env` 文件,无需改动任何代码: ::: code-group ```ini [MySQL(默认)] [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.elevue USERNAME = root PASSWORD = root HOSTPORT = 3306 ``` ```ini [PostgreSQL] [DATABASE] TYPE = pgsql HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.elevue USERNAME = postgres PASSWORD = root HOSTPORT = 5432 ``` ```ini [SQL Server] [DATABASE] TYPE = sqlsrv HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.elevue USERNAME = sa PASSWORD = root HOSTPORT = 1433 ``` ```ini [Oracle] [DATABASE] TYPE = oracle HOSTNAME = 127.0.0.1 DATABASE = rxthinkcmf.thinkphp6.elevue USERNAME = root PASSWORD = root HOSTPORT = 1521 ``` ```ini [SQLite] [DATABASE] TYPE = sqlite DATABASE = /www/api/runtime/database.sqlite ``` ::: ### 配置文件结构 ```php // config/database.php return [ 'default' => env('database.type', 'mysql'), 'connections' => [ 'mysql' => [...], 'pgsql' => [...], 'sqlsrv' => [...], 'oracle' => [...], 'sqlite' => [...], ], ]; ``` ### 字段类型映射 | 通用类型 | MySQL | PostgreSQL | SQL Server | Oracle | SQLite | |---------|-------|------------|------------|--------|--------| | 自增主键 | `INT AUTO_INCREMENT` | `SERIAL` | `INT IDENTITY` | `NUMBER` + 序列 | `INTEGER PRIMARY KEY` | | 字符串 | `VARCHAR(n)` | `VARCHAR(n)` | `NVARCHAR(n)` | `VARCHAR2(n)` | `TEXT` | | 文本 | `TEXT` | `TEXT` | `NVARCHAR(MAX)` | `CLOB` | `TEXT` | | 布尔 | `TINYINT(1)` | `BOOLEAN` | `BIT` | `NUMBER(1)` | `INTEGER` | | 日期时间 | `DATETIME` | `TIMESTAMP` | `DATETIME2` | `TIMESTAMP` | `TEXT` | | 小数 | `DECIMAL(m,n)` | `NUMERIC(m,n)` | `DECIMAL(m,n)` | `NUMBER(m,n)` | `REAL` | :::tip 业务代码零修改 ThinkPHP 的 ORM 层会自动处理大部分 SQL 差异,切换数据库只需修改 `.env` 中的 `DATABASE.TYPE`,业务代码无需任何修改。 ::: ### 各数据库安装与配置 项目支持五种数据库,按需选择一种即可。 | 数据库 | 推荐场景 | 难度 | XAMPP 自带 | 说明 | |--------|---------|------|-----------|------| | **MySQL** | 日常开发、中小项目 | ⭐ 低 | ✅ 是 | 默认推荐,开箱即用 | | **PostgreSQL** | 需要 JSONB、全文检索 | ⭐⭐ 中 | ❌ 否 | 功能丰富,需单独安装 | | **SQLite** | 快速演示、单元测试 | ⭐ 低 | ✅ 是 | 无需数据库服务,零配置 | | **SQL Server** | 企业 Windows 环境 | ⭐⭐ 中 | 驱动自带 | 需单独安装数据库服务 | | **Oracle** | 大型企业项目 | ⭐⭐⭐ 高 | 驱动自带 | 需安装 Instant Client | ::: tip 新手推荐 XAMPP 已集成 MySQL 数据库服务,安装 XAMPP 后无需再单独安装数据库。 ::: #### MySQL 数据库 MySQL 是项目默认推荐的关系型数据库,XAMPP 已自带,开箱即用。 ::: code-group ```sh [Windows] # XAMPP 已自带 MySQL,无需额外安装 # 在 XAMPP 控制面板启动 MySQL 即可 # 确认扩展已启用(编辑 D:\xampp8.2\php\php.ini): # extension=pdo_mysql # 若前面有分号则去掉,保存后重启 XAMPP # 创建数据库 D:\xampp8.2\mysql\bin\mysql.exe -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp6.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" ``` ```sh [macOS] brew install mysql brew services start mysql sudo mysql_secure_installation # 创建数据库 mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp6.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" ``` ```sh [Ubuntu / Debian] sudo apt install mysql-server sudo systemctl start mysql sudo systemctl enable mysql sudo mysql_secure_installation # 创建数据库 mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp6.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" ``` ```sh [Rocky Linux / CentOS] sudo dnf install mysql-server sudo systemctl start mysqld sudo systemctl enable mysqld sudo mysql_secure_installation # 创建数据库 mysql -u root -proot -e "CREATE DATABASE `rxthinkcmf.thinkphp6.elevue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" ``` ::: #### PostgreSQL 数据库 PostgreSQL 功能强大,支持 JSONB、全文检索等高级特性,需单独安装。 ::: code-group ```sh [Windows] # 安装 PostgreSQL # 访问 https://www.postgresql.org/download/windows/ 下载安装包 # 安装过程中记住设置的密码 # 确认扩展已启用(编辑 D:\xampp8.2\php\php.ini): # extension=pdo_pgsql # extension=pgsql # 若前面有分号则去掉,保存后重启 XAMPP # 设置 postgres 密码(首次) psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'root';" # 创建数据库 psql -U postgres -c "CREATE DATABASE \"rxthinkcmf.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';" ``` ```sh [macOS] brew install postgresql brew services start postgresql # 设置 postgres 密码 sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'root';" # 创建数据库 sudo -u postgres psql -c "CREATE DATABASE \"rxthinkcmf.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';" sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp6.elevue\" TO postgres;" ``` ```sh [Ubuntu / Debian] sudo apt install postgresql postgresql-contrib sudo systemctl start postgresql # 设置 postgres 密码 sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'root';" # 创建数据库 sudo -u postgres psql -c "CREATE DATABASE \"rxthinkcmf.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';" sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp6.elevue\" TO postgres;" ``` ```sh [Rocky Linux / CentOS] sudo dnf install postgresql-server sudo postgresql-setup --initdb sudo systemctl start postgresql # 设置 postgres 密码 sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'root';" # 创建数据库 sudo -u postgres psql -c "CREATE DATABASE \"rxthinkcmf.thinkphp6.elevue\" OWNER postgres ENCODING 'UTF8';" sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE \"rxthinkcmf.thinkphp6.elevue\" TO postgres;" ``` ::: #### SQLite 数据库 SQLite 无需安装数据库服务器,数据存储在单个文件中,适合开发环境和小型项目。 ::: code-group ```sh [Windows] # XAMPP 已自带 SQLite 扩展,无需额外安装 # 只需创建数据库文件 mkdir D:\xampp\htdocs\runtime echo. > D:\xampp\htdocs\runtime\database.sqlite # 确认扩展已启用(编辑 D:\xampp8.2\php\php.ini): # extension=pdo_sqlite # extension=sqlite3 # 若前面有分号则去掉,保存后重启 XAMPP # .env 配置 # DATABASE.TYPE = sqlite # DATABASE.DATABASE = D:/xampp8.2/htdocs/runtime/database.sqlite ``` ```sh [macOS] brew install php sqlite # 创建数据库文件 mkdir -p /www/api/runtime touch /www/api/runtime/database.sqlite ``` ```sh [Ubuntu / Debian] sudo apt install php8.2-sqlite3 # 创建数据库文件 mkdir -p /www/api/runtime touch /www/api/runtime/database.sqlite ``` ```sh [Rocky Linux / CentOS] sudo dnf install php-sqlite3 # 创建数据库文件 mkdir -p /www/api/runtime touch /www/api/runtime/database.sqlite ``` ::: #### SQL Server 数据库 SQL Server 是微软商业数据库,XAMPP 已自带 pdo_sqlsrv 驱动,Windows 下开箱即用。 ::: code-group ```sh [Windows] # SQL Server 需单独安装(XAMPP 不自带数据库服务,但自带 PHP 驱动) # 1. 下载安装 SQL Server Express:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads # 2. XAMPP 已自带 pdo_sqlsrv 扩展,在 php.ini 中启用: # extension=php_sqlsrv_82_ts_x64.dll # extension=php_pdo_sqlsrv_82_ts_x64.dll # 创建数据库 sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp6.elevue] COLLATE Chinese_PRC_CI_AS" ``` ```sh [macOS] # macOS 不原生支持 SQL Server,建议使用 Docker docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=root" \ -p 1433:1433 --name sqlserver \ -d mcr.microsoft.com/mssql/server:2022-latest # 安装 PHP 扩展 pecl install pdo_sqlsrv # 创建数据库 sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp6.elevue] COLLATE Chinese_PRC_CI_AS" ``` ```sh [Ubuntu / Debian] # 1. 安装 SQL Server curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list)" sudo apt update sudo apt install -y mssql-server sudo /opt/mssql/bin/mssql-conf setup # 2. 安装命令行工具 sudo apt install -y mssql-tools18 echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc source ~/.bashrc # 3. 安装 PHP 扩展 sudo pecl install pdo_sqlsrv echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/8.2/mods-available/pdo_sqlsrv.ini sudo phpenmod pdo_sqlsrv # 创建数据库 sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp6.elevue] COLLATE Chinese_PRC_CI_AS" ``` ```sh [Rocky Linux / CentOS] # 1. 安装 SQL Server sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2022.repo sudo dnf install -y mssql-server sudo /opt/mssql/bin/mssql-conf setup # 2. 安装命令行工具 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo sudo dnf install -y mssql-tools18 echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc source ~/.bashrc # 3. 安装 PHP 扩展 sudo pecl install pdo_sqlsrv echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php.d/pdo_sqlsrv.ini # 创建数据库 sqlcmd -S localhost -U sa -P root -Q "CREATE DATABASE [rxthinkcmf.thinkphp6.elevue] COLLATE Chinese_PRC_CI_AS" ``` ::: #### Oracle 数据库 Oracle 是企业级商业数据库,需手动安装 Instant Client 和 pdo_oci 扩展。 ::: code-group ```sh [Windows] # XAMPP 已自带 php_pdo_oci.dll,只需安装 Oracle Instant Client 并在 php.ini 中启用 # 1. 安装 Oracle Instant Client # 下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html # 选择 Basic Package,x64,推荐 19c # 解压到 C:\oracle\instantclient_19_20(⚠️ 避免空格与中文) # 2. 配置系统环境变量 # 将 C:\oracle\instantclient_19_20 添加到系统 PATH # 3. 安装 VC++ 运行库(必装) # 下载:https://aka.ms/vc14/vc_redist.x64.exe # 4. 启用扩展 # 编辑 D:\xampp8.2\php\php.ini,去掉分号: # extension=pdo_oci # 5. 重启 XAMPP(完全关闭再启动) # .env 配置 # DATABASE.TYPE = oracle # DATABASE.HOSTNAME = 127.0.0.1 # DATABASE.DATABASE = rxthinkcmf.thinkphp6.elevue # DATABASE.USERNAME = root # DATABASE.PASSWORD = root # DATABASE.HOSTPORT = 1521 ``` ```sh [macOS] # Oracle 不原生支持 macOS,建议使用 Docker docker run -d --name oracle-xe -p 1521:1521 \ -e ORACLE_PWD=root \ gvenzl/oracle-xe:21-slim # 安装 PHP 扩展 pecl install pdo_oci ``` ```sh [Ubuntu / Debian] # 1. 安装 Oracle Database sudo dpkg -i oracle-database-xe-21c-1.0-1.x86_64.deb sudo /etc/init.d/oracle-xe-21c configure # 2. 安装 Oracle Instant Client sudo dpkg -i oracle-instantclient-basic-*.deb sudo dpkg -i oracle-instantclient-devel-*.deb # 3. 安装 PHP 扩展 sudo pecl install pdo_oci echo "extension=pdo_oci.so" | sudo tee /etc/php/8.2/mods-available/pdo_oci.ini sudo phpenmod pdo_oci # 4. 创建表空间和用户 sqlplus system/root@localhost:1521/XE <