Expand description
模型模块 — BaseModel trait + Append 字段系统
对齐 PHP think\Model + app\common\model\szoa\BaseModel,委托 SZ-ORM Model。
§PHP 对齐
| PHP 属性/方法 | Rust 等价 | 说明 |
|---|---|---|
$name | Model::table_name() | 表名 |
$pk | Model::pk_name() + Model::pk() | 主键列名 + 主键值 |
$append | BaseModel::append() | 追加虚拟字段 |
getXxxAttr | BaseModel::get_appended_value() | 访问器(虚拟字段值) |
$field/$fillable | ModelExt::fillable() | 可批量赋值字段 |
$disuse/$guarded | ModelExt::guarded() | 受保护字段 |
$hidden | ModelExt::hidden() | 序列化时隐藏字段 |
$visible | ModelExt::visible() | 序列化时白名单字段 |
$type | ModelExt::casts() | 字段类型转换 |
save() | Repository 层 | 持久化由 Repository 提供(见架构说明) |
delete() | Repository 层 | 持久化由 Repository 提供 |
startTrans()/commit()/rollback() | Repository 层 | 事务由 Repository 提供 |
§架构决策:Model 与 Repository 分离
PHP think\Model 采用 Active Record 模式,Model 既是数据载体也是持久化行为。
Rust SZ-ORM 采用 Data Mapper + Repository 模式:
BaseModeltrait 只描述模型元数据(表名/主键/字段/append)- 持久化动作(save/delete/事务)由
sz_orm_core::repository::Repository提供
这符合 Rust 的设计哲学:分离数据描述与副作用行为,避免 Model trait 承载过多职责。
业务模型通过实现 BaseModel trait 获得元数据描述能力,
通过注入 Repository 获得持久化能力。
§Append 字段系统
对齐 PHP $append = ['status_text'] + getStatusTextAttr($value, $data):
ⓘ
use sz_rust_core::model::BaseModel;
use serde_json::json;
struct Customer {
customer_id: i64,
status: i32,
}
impl BaseModel for Customer {
fn append() -> Vec<&'static str> {
vec!["status_text"]
}
fn get_appended_value(&self, field: &str) -> Option<serde_json::Value> {
match field {
"status_text" => Some(json!(match self.status {
0 => "禁用",
1 => "启用",
_ => "未知",
})),
_ => None,
}
}
}Structs§
- Append
State - 动态 Append 状态 — 对齐 PHP
$this->append实例属性
Enums§
- Mutator
Result - 修改器返回结果 — 对齐 PHP
setXxxAttr返回值语义
Traits§
- Accessor
- 访问器 trait — 对齐 PHP
getAttr/getXxxAttr - Appendable
- Appendable trait — 对齐 PHP
append()+getAttr()统一派发 - Base
Model - BaseModel trait — 对齐 PHP
app\common\model\szoa\BaseModel - Mutator
- 修改器 trait — 对齐 PHP
setAttr/setXxxAttr