# 数据对象规格说明
# 概述
数据对象除了属性和方法的定义, 还有更多高级定义方式
其实现数据对象的关系定义主要放置在类
DataObjectSpec
里DataObjectRelation
里DataObjectSpec
- 路径 : core/model/dataobject/
- 文件名称: DataObjectSpec.php
DataObjectRelation
- 路径 : core/model/dataobject/
- 文件名称: DataObjectRelation.php
数据对象的规格说明默认定义变量如下:
- $field_spec : 列规格定义说明
- $has_one : 一对一关系说明
- $belong_has_one : 从属一对一关系说明
- $has_many : 一对多关系说明
- $many_many : 多对多关系说明
- $belongs_many_many: 从属于多对多关系说明
除第一个变量用于列规格说明外, 其它变量都用于表[类]关系说明;
第一个变量为实例变量,其他关系变量都定义为静态类变量;
一般情况下数据对象无需定义规格说明,定义了规格说明以后, 利用框架内置的规格说明实现功能, 可以轻而易举实现很多功能, 这在后面会进一步详细说明;
通过代码生成数据对象类说明的时候,会自动生成相应的数据对象的规格说明配置变量;
如果未按照数据库原型设计规范定义数据库, 则需要按本文说明手动配置数据对象的规格说明配置变量。
# 详细说明
# $field_spec:列规格定义说明
数据对象定义需定义字段: public $field_spec, 它定义了当前数据对象的列规格说明。
定义形式如下:
public $field_spec = array( EnumColumnNameDefault::ID => 'id', EnumColumnNameDefault::COMMITTIME => 'publishTime', EnumDataSpec::REMOVE => array( 'updateTime' ), EnumDataSpec::MANY_MANY_TABLE => array( // 多对多关系类名 => 多对多关系表名 ), EnumDataSpec::FOREIGN_ID => array( // 类名 => 外键名 // 实例对象名 => 外键名[在从属于一对一关系类名中经常遇到, 比如家庭地址中省|市|区都关联同一个类:地区;需要用实例对象名] ) );
# 基本定义
在数据对象的列规格里
- $key->$value说明是: DataObject默认列名->列别名。
它主要用于与第三方WEB应用整合时, 可能数据对象表唯一标识定义为$table_id,如用户表的唯一标识是: user_id;
在框架中设计当列名有别名时, 以列别名去表中查找相应列。
- remove:在数据对象中移除不需要持久化的列。
如数据对象中不需要列commitTime或者updateTime数据列时, 只需要在其中声明, 其中声明的列即不在框架的持久层中进行存储。
- many_many_table:多对多关系表名称定义, 如无定义, 则按默认规则查找指定表。
多对多表名默认规则:
- 多对多【主控端-即定义为$many_many】:数据库表名前缀+“”+[文件夹目录+“”]...+TABLENAME_RELATION+"_"+主表名+关系表名。
- 如User和Role是多对多关系, 数据库表名前缀为bb,文件夹目录是user,TABLENAME_RELATION是re;那么在User里定义$many_many包含:Role;则对应的表名是: bb_user_re_userrole.
- 多对多【从属端-即定义为$belongs_many_many】:数据库表名前缀+“”+[文件夹目录+“”]...+TABLENAME_RELATION+"_"+关系表名+主表名。
- 如User和Role是多对多关系, 数据库表名前缀为bb,文件夹目录是user,TABLENAME_RELATION是re;那么在Role里定义$belongs_many_many包含:User;则对应的表名是:bb_user_re_userrole.
- foreign_id: 在对象之间或者说表之间存在一对一, 一对多, 多对多的关系时, 可通过它指定外键的名称, 如果没有指定, 则按默认定义。
外键的名称默认定义:
一对一:【关系表类名+"_"+id】;注意关系表类名头字母小写
- 如UserDetail和User是一对一关系, 则在UserDetail中对应User的外键就是: user_id。
- 在User中定义
$has_one
是UserDetail, 在UserDetail定义$belong_has_one
是User
一对多:【关系表类名+"_"+id】;注意关系表类名头字母小写
- 如Department和User是一对多关系, 则在User中对应Department的外键就是: department_id
- 在User中定义
$belong_has_one
是Department, 在Department中定义$has_many
是User。
多对多【主控端】:多对多关系会产生一张中间表,它定义在EnumDataSpec::MANY_MANY_TABLE里,
- 注意表类名头字母小写。
- 主表类外键名称: 【主表类名+""+id】, 关系表类外键名称: 【关系表类名+""+id】
多对多【从属端】:多对多关系会产生一张中间表,它定义在EnumDataSpec::MANY_MANY_TABLE里,
- 注意表类名头字母小写。
- 主表类外键名称: 【主表类名+""+id】, 关系表类外键名称: 【关系表类名+""+id】
说明: $field_spec_default为默认的数据对象的列规格说明, 它全局的定义了当前应用的列规格说明;
# 示例说明
示例1:用户详细信息定义列规格说明如下:
public $field_spec = array( EnumDataSpec::FOREIGN_ID => array( 'country_r' => "country", "province_r" => "province", "city_r" => "city", 'district_r' => "district" ) );
示例2:用户角色列规格说明如下:
public $field_spec = array( EnumDataSpec::REMOVE => array( 'commitTime', 'updateTime' ) );
# $has_one:一对一关系说明
# 基本定义
- 相对于数据库定义, 表关系定义: 一对一[has_one]
- 例如示例项目中
- 主数据对象:User
- 从数据对象:Userdetail
- 用户[主数据对象]和用户详情[从数据对象]就是一对一关系
# 示例说明
定义示例:
class User extends DataObject { static $has_one = array( "userDetail" => "UserDetail", );
调用示例:
$user = User::getById( 1 ); $userdetail = $user->userdetail; print_r($userdetail);
# $belong_has_one:从属一对一关系说明
# 基本定义
相对于数据库定义, 表关系定义:从属于一对一[belong_has_one]
例如示例项目中
- 主数据对象: User
- 从数据对象: Userdetail
- 用户详情[从数据对象]和用户[主数据对象]就是从属于一对一关系
# 示例说明
定义示例:
class Userdetail extends DataObject { static $belongs_has_one = array( "user" => "User" );
调用示例:
$userdetail = Userdetail::getById( 1 ); $user = $userdetail->user; print_r($user);
# $has_many:一对多关系说明
# 基本定义
相对于数据库定义, 一对多[has_many]
例如示例项目中
- 主数据对象:Blog
- 从数据对象:Comment
- 博客[主数据对象]和评论[从数据对象]就是一对多关系
# 示例说明
定义示例:
class Blog extends DataObject { static $has_many = array( "comments" => "Comment", );
调用示例:
$blog = Blog::getById( 1 ); $comments = $blog->comments; print_r($comments);
# $many_many:多对多关系说明
# 基本定义
相对于数据库定义, 多对多[many_many]
例如示例项目中
- 主数据对象:User
- 从数据对象:Role
- 多对多关系数据对象:Userrole
- 用户[主数据对象]和角色[从数据对象]就是多对多关系
# 示例说明
- 定义示例:
class User extends DataObject { static $many_many = array( "roles" => "Role", );
- 调用示例:
$user = User::getById( 1 ); $roles = $user->roles; print_r($roles);
# $belongs_many_many:从属于多对多关系说明
# 基本定义
相对于数据库定义, 表关系定义:从属于多对多[belongs_many_many]
例如示例项目中
- 主数据对象:User
- 从数据对象:Role
- 多对多关系数据对象:Userrole
- 角色[从数据对象]和用户[主数据对象]就是从属于多对多关系
# 示例说明
定义示例:
class Role extends DataObject { static $belongs_many_many = array( "users" => "User" );
调用示例:
$role = Role::getById( 1 ); $users = $role->users; print_r($users);
# 更多说明
数据对象规格说明定义变量总共就5个,值得说明一下的是这些变量涉及的实现策略和规律总结, 以下对其进行进一步的说明, 有兴趣的朋友可以了解一下
# 数据对象默认关键字定义
枚举类名称定义: EnumDataObjectDefaultKeyword
详细定义:
NAME_FIELD_SPEC:field_spec
自定义列规格说明的名称。
NAME_IDNAME_STRATEGY:idname_strategy
ID名称定义的策略的名称
NAME_IDNAME_CONCAT:idname_concat
ID名称中的连接符的名称
NAME_FOREIGNIDNAME_STRATEGY:foreignid_name_strategy
Foreign ID名称定义的策略的名称
NAME_FOREIGNID_CONCAT:foreignid_concat
Foreign ID名称中的连接符的名称,Foreign ID名称定义的策略为TABLENAME_ID有效
# 数据库关联模式
枚举类名称定义: EnumTableRelation
详细定义:
HAS_ONE:has_one
一对一关联
BELONG_HAS_ONE:belong_has_one
从属一对一关联, 即主表中一字段关联关系表中的主键
HAS_MANY:has_many
一对多关联
MANY_MANY:many_many
多对多关联
BELONGS_TO:belongs_many_many
从属多对多关联
# 数据对象默认列定义
枚举类名称定义: EnumColumnNameDefault
详细定义:
ID:id
数据对象的唯一标识
COMMITTIME:commitTime
数据创建的时间
UPDATETIME:updateTime
数据最后更新的时间
# ID名称定义的策略
- 枚举类名称定义: EnumIDNameStrategy
- 详细定义:
NONE:-1
无策略;说明: 需要在数据对象类里定义$field_spec;说明ID别名。
ID:0
ID名称为: id
TABLENAMEID:1
ID名称为:对象名+'id';如果对象名为User,则ID名称为:userid【头字母大小写均可】
TABLENAME_ID:2
ID名称为:对象名+连接符+'id';如果对象名为User,连接符为'_';则ID名称为:user_id【头字母大小写均可】
# 数据对象列规格默认列定义
- 枚举类名称定义:EnumDataSpec
- 详细定义:
REMOVE:remove
数据对象定义中需要移除的列
MANY_MANY_TABLE:many_many_table
多对多关系表名称定义, 如无定义, 则按默认规则查找指定表。
FOREIGN_ID:foreign_id
数据对象外键名称定义, 如无定义, 则按默认规则查找指定外键。
# 项目默认配置统一调整
以上配置的使用都定义在文件DataObject.php里, 所有的数据对象都继承它, 默认都采用在该文件中的配置; 作者推荐尽量使用该配置;
如果在实际项目中, 确实需要调整该配置, 可以通过以上配置说明中的值进行定制。
路径 : core/model/
文件名称: DataObject.php
详细定义:
public static $idname_strategy = EnumIDNameStrategy::TABLENAME_ID;
ID名称定义的策略
public static $idname_concat = '_';
ID名称中的连接符。ID名称定义的策略为TABLENAME_ID有效。
public static $foreignid_name_strategy = EnumForeignIDNameStrategy::TABLENAME_ID;
Foreign ID名称定义的策略
$foreignid_concat = '_';
Foreign ID名称中的连接符。Foreign ID名称定义的策略为TABLENAME_ID有效。