Skip to main content

Module model

Module model 

Source
Expand description

模型模块 — BaseModel trait + Append 字段系统

对齐 PHP think\Model + app\common\model\szoa\BaseModel,委托 SZ-ORM Model

§PHP 对齐

PHP 属性/方法Rust 等价说明
$nameModel::table_name()表名
$pkModel::pk_name() + Model::pk()主键列名 + 主键值
$appendBaseModel::append()追加虚拟字段
getXxxAttrBaseModel::get_appended_value()访问器(虚拟字段值)
$field/$fillableModelExt::fillable()可批量赋值字段
$disuse/$guardedModelExt::guarded()受保护字段
$hiddenModelExt::hidden()序列化时隐藏字段
$visibleModelExt::visible()序列化时白名单字段
$typeModelExt::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 模式:

  • BaseModel trait 只描述模型元数据(表名/主键/字段/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§

AppendState
动态 Append 状态 — 对齐 PHP $this->append 实例属性

Enums§

MutatorResult
修改器返回结果 — 对齐 PHP setXxxAttr 返回值语义

Traits§

Accessor
访问器 trait — 对齐 PHP getAttr / getXxxAttr
Appendable
Appendable trait — 对齐 PHP append() + getAttr() 统一派发
BaseModel
BaseModel trait — 对齐 PHP app\common\model\szoa\BaseModel
Mutator
修改器 trait — 对齐 PHP setAttr / setXxxAttr