Hyperf 3.1 中数据库表前缀通过 config/autoload/databases.php 的 'prefix' => env('DB_PREFIX', '') 配置,并在 .env 中定义 DB_PREFIX=app_ 实现联动;仅 ORM 和 Query Builder 自动生效,原生 SQL 和迁移需手动处理。

Hyperf 3.1 中配置数据库表前缀,核心是通过 databases.php 的 prefix 键控制,且必须与 .env 变量联动,不能只写死在配置文件里。
在 databases.php 中正确设置 prefix
打开 config/autoload/databases.php,找到 mysql(或其他数据库)配置项,在其内部添加或修改 'prefix' 字段,使用 env() 读取环境变量:
-
'prefix' => env('DB_PREFIX', '')—— 推荐写法,支持空字符串默认值 -
'prefix' => env('DB_PREFIX', 'hy_')—— 若希望默认带前缀,可设为'hy_' - 确保该字段与其他配置(如
host、database)同级,位于'mysql' => [ ... ]数组内
在 .env 中定义 DB_PREFIX
在项目根目录的 .env 文件中添加一行(注意无空格、无引号):
-
DB_PREFIX=app_→ 表名将自动变为app_users、app_posts -
DB_PREFIX=→ 留空表示不加前缀(等效于空字符串) - 大小写敏感,必须严格写成
DB_PREFIX,不能是db_prefix或DB_PREFIXES
前缀生效范围与注意事项
该配置仅影响通过 Hyperf ORM(Eloquent)或 Query Builder 创建的查询,例如:
立即学习“PHP免费学习笔记(深入)”;
-
User::all()实际查的是app_users表(若DB_PREFIX=app_) -
DB::table('users')->get()同样自动加上前缀 - 原生 SQL 查询(如
DB::select('SELECT * FROM users'))不会自动加前缀,需手动拼接 - 迁移文件中创建表时,
$table->engine = 'InnoDB'等操作不受prefix影响,建表名仍为代码中写的名称;如需统一前缀,建议在迁移中显式使用DB::getTablePrefix() . 'users'或在Schema::create()外层处理
验证前缀是否生效
启动服务后,可临时在命令行执行:
php bin/hyperf.php db:query "SHOW TABLES LIKE 'app_%';"
或在控制器中打印:
-
var_dump(DB::getTablePrefix());—— 应输出你配置的值(如'app_') -
var_dump((new App\Model\User())->getTable());—— 应返回带前缀的完整表名



















