Webman 的 Model 操作需满足类路径、继承 supportModel、手动配置三者齐备;$table、$primaryKey、$fillable 等属性必须显式声明,否则查询失败或静默错误;关联、多库、事务等高级功能受限,需严格按规则配置。

Webman 的 Model 操作不是“装上就能用”,它依赖明确的类路径、正确继承、手动补全配置三者齐备,缺一不可。直接跑 Db::table() 能写能查,但要用 Model,就得按它的规则来。
Model 类文件生成后为什么报 Class 'supportModel' not found
这是最常卡住的第一步。webman 的模型基类 supportModel 不是 PHP 自带,而是来自 workerman/support 包。命令行生成只是写了个壳,不负责装依赖、不检查 autoload 是否生效。
- 运行
composer show workerman/support,确认已安装;没输出就先composer require workerman/support - 检查
vendor/composer/autoload_psr4.php中是否包含"support\" => ["vendor/workerman/support/src/"] - 生成命令如
php webman make:model User会创建app/model/User.php,但不会自动创建中间目录(比如app/admin/model),得手动建好再运行
$table、$primaryKey、$fillable 这些属性为什么必须手动加
webman make:model 只生成空骨架,连表名都不猜。Model 默认按「类名单数转复数」找表(User → users),现实里几乎不匹配。
- 表名不是约定俗成的复数?加
protected $table = 'my_user_info'; - 主键字段叫
user_id而非id?加protected $primaryKey = 'user_id'; - 要用
create()或fill()批量赋值?必须显式声明protected $fillable = ['name', 'email'];,否则静默失败或抛MassAssignmentException -
$timestamps = false得手动关,否则插入时会尝试写入不存在的created_at/updated_at字段,导致 SQL 错误
Db::table() 和 Model::find() 查询行为差异在哪
底层都是走 PDO,但 Model 封装了更多逻辑,也带来更多隐式约束。
立即学习“PHP免费学习笔记(深入)”;
-
Db::table('user')->where('id', 1)->first()直接返回数组,字段名原样;User::find(1)返回User实例,字段自动转为对象属性,且会触发访问器(getFullNameAttribute)、强制类型转换($casts)等 -
Model::find()默认只查主键,传非主键值(比如User::find('abc'))会返回 null,不是报错 —— 它内部是WHERE id = ?,别误以为支持任意字段查找 - 关联查询(
with('posts'))只能用 Model,Db::table()需手动join,且结果是扁平数组,没法自动嵌套 - Model 查询默认走连接池,但事务中若混用
Db::table()和 Model,可能跨连接,导致事务失效
多数据库下 Model 怎么绑定指定连接
Model 不自动读 config/database.php 里的 default,得显式指定。
- 在 Model 类里加
protected $connection = 'mysql_log';,前提是config/database.php的connections数组里已定义mysql_log - 不能靠
Db::connection('log')->table(...)临时切连接再调 Model 方法,Model 内部仍用自己声明的$connection - 跨库关联(比如用户表在 mysql,日志表在 mysql_log)无法用 Eloquent 式
belongsTo,得用原生Db::table()->join()或分两次查再合并 - 跨库事务 Webman 不支持,得用补偿逻辑:先写主库,成功后再异步发消息写日志库,失败则回滚主库并告警
Model 看似省代码,实则把隐式规则全摊开了——表名、主键、可写字段、时间戳、连接名,一个不填就可能查不到、插不进、改不动。别指望它“智能推断”,它只认你亲手写的那几行配置。



















