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,并补充:
- Append 字段系统(对齐 PHP
$append+getXxxAttr) - 带 append 的序列化(
Self::to_json_with_append)
§元数据属性继承
BaseModel 通过组合 SZ-ORM trait 自动获得以下能力:
- 表名:
Model::table_name()(对齐 PHP$name) - 主键:
Model::pk_name()+Model::pk()(对齐 PHP$pk) - 可填充字段:
ModelExt::fillable()(对齐 PHP$field/$fillable) - 受保护字段:
ModelExt::guarded()(对齐 PHP$disuse/$guarded) - 隐藏字段:
ModelExt::hidden()(对齐 PHP$hidden) - 可见字段:
ModelExt::visible()(对齐 PHP$visible) - 类型转换:
ModelExt::casts()(对齐 PHP$type)
§持久化方法
PHP save()/delete()/startTrans()/commit()/rollback() 由
sz_orm_core::repository::Repository 提供,不在 BaseModel trait 中定义。
详见模块文档「架构决策:Model 与 Repository 分离」。
Provided Methods§
Sourcefn append() -> Vec<&'static str>
fn append() -> Vec<&'static str>
追加字段列表(对齐 PHP $append = ['status_text'])
序列化时自动追加这些虚拟字段,配合 Self::get_appended_value() 提供具体值。
§默认实现
返回空 Vec(无追加字段),业务模型按需重写。
Sourcefn get_appended_value(&self, _field: &str) -> Option<Value>
fn get_appended_value(&self, _field: &str) -> Option<Value>
获取追加字段的值(对齐 PHP getXxxAttr($value, $data))
默认返回 None。业务模型重写此方法,根据当前模型数据计算虚拟字段值。
§参数
field:字段名(来自Self::append()列表)
§返回
Some(Value):字段值None:字段不存在或无法计算
Sourcefn to_json_with_append(&self) -> Value
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,对齐 PHPConversion.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".