hyperf 是基于 swoole 的高性能协程 php 框架,其模型操作需继承 hyperfdatabasemodelmodel,配置表名、连接、主键;crud 遵循 eloquent 规范但注意协程安全;事务须在同协程内完成;推荐使用 casts、显式 select、paginate 及语义化方法命名。

Hyperf 是基于 Swoole 的高性能协程 PHP 框架,模型(Model)操作是日常开发中最基础也最频繁的部分。刚上手时容易卡在连接配置、查询写法、事务处理等细节上。掌握核心 CRUD 流程 + 少量关键技巧,就能快速写出稳定、可读、符合 Hyperf 风格的数据库代码。
模型定义与数据库连接对齐
Hyperf 使用 eloquent 作为默认 ORM(通过 hyperf/database 组件),模型需继承 HyperfDatabaseModelModel。注意两点:
- 模型类名默认对应表名(驼峰转下划线),如
UserProfile→user_profile;若不一致,需显式设置protected $table = 'my_users'; - 确保
config/autoload/databases.php中已正确配置 default 连接,并在模型中指定连接名(如多库场景):protected $connection = 'mysql'; - 主键默认为
id,若为其他字段(如uid),需声明:protected $primaryKey = 'uid';
增删改查(CRUD)写法要点
Hyperf 的 Eloquent 写法和 laravel 高度一致,但要注意协程环境下的调用方式:
- 查(Read):支持链式查询,推荐使用
where+firstOrFail()或get();避免直接用find(1)(它会走主键缓存,且不触发事件) - 增(Create):用
create()前确保模型设置了$fillable白名单,或用new Model([...])->save()手动赋值 - 改(Update):推荐先
find()或where()->first()获取模型实例再调用save();批量更新用where()->update([...])(不触发模型事件和访问器) - 删(delete):软删除需开启
use SoftDeletes;并设置$dates = ['deleted_at'];;硬删除直接delete(),软删除后记录仍可通过withTrashed()查出
事务与协程安全写法
在协程中执行数据库事务,必须确保整个事务块在同一个协程上下文内完成,否则可能跨协程导致连接错乱:
- 不要在事务中 await 其他协程 IO(如 http 请求、redis 调用),除非你明确控制了上下文
- 标准事务写法:
DB::transaction(function () { ... });,内部所有模型操作自动绑定同一连接 - 手动事务(需 try/catch):
DB::beginTransaction();→ 操作 →DB::commit();或DB::rollback(); - 注意:模型事件(
creating,saving等)在事务中正常触发,可用于数据校验或关联写入
常用技巧与避坑提醒
这些小细节常被忽略,却直接影响代码健壮性: