Skip to main content

BaseModel

Trait BaseModel 

Source
pub trait BaseModel:
    Model
    + ModelExt
    + RelationLoader
    + Send
    + Sync
    + 'static {
    // Provided methods
    fn append() -> Vec<&'static str> { ... }
    fn get_appended_value(&self, _field: &str) -> Option<Value> { ... }
    fn to_json_with_append(&self) -> Value { ... }
}
Expand description

BaseModel trait — 对齐 PHP app\common\model\szoa\BaseModel

组合 SZ-ORM 的 Model + ModelExt + RelationLoader,并补充:

  1. Append 字段系统(对齐 PHP $append + getXxxAttr
  2. 带 append 的序列化Self::to_json_with_append

§元数据属性继承

BaseModel 通过组合 SZ-ORM trait 自动获得以下能力:

§持久化方法

PHP save()/delete()/startTrans()/commit()/rollback()sz_orm_core::repository::Repository 提供,不在 BaseModel trait 中定义。 详见模块文档「架构决策:Model 与 Repository 分离」。

Provided Methods§

Source

fn append() -> Vec<&'static str>

追加字段列表(对齐 PHP $append = ['status_text']

序列化时自动追加这些虚拟字段,配合 Self::get_appended_value() 提供具体值。

§默认实现

返回空 Vec(无追加字段),业务模型按需重写。

Source

fn get_appended_value(&self, _field: &str) -> Option<Value>

获取追加字段的值(对齐 PHP getXxxAttr($value, $data)

默认返回 None。业务模型重写此方法,根据当前模型数据计算虚拟字段值。

§参数
§返回
  • Some(Value):字段值
  • None:字段不存在或无法计算
Source

fn to_json_with_append(&self) -> Value

序列化为 JSON(包含 append 字段)

先调用 ModelExt::to_json() 获取基础 JSON,然后追加 Self::append() 中定义的虚拟字段(通过 Self::get_appended_value() 获取值)。

§字段顺序

基础字段在前,append 字段在后(对齐 PHP array_merge 行为)。 append 字段之间的顺序由 Self::append() 返回的 Vec 顺序决定。

§PHP 行为对齐
  • append 字段始终输出(无访问器返回 null,对齐 PHP Conversion.php 第 292 行 $item[$name] = $this->getAttr($name)getAttr 无访问器时返回 null
  • append 字段绕过 hidden 过滤(PHP bug 复刻:appendAttrToArray 直接赋值, 不检查 $hidden,见 Conversion.php 第 291-296 行)
§缓存说明

此方法走 get_appended_value(独立路径,不带访问器缓存)。 若需走访问器缓存(对齐 PHP getAttr 缓存机制),请实现 Appendable trait 并使用 Appendable::to_json_with_append_cached()

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§