数据对象规格说明
概述
数据对象除了属性和方法的定义,还有更多高级定义方式,其实现 数据对象的关系定义主要放置在类DataObjectSpec里DataObjectRelation里
路径 :core/model/dataobject/
文件名称:DataObjectSpec.php
文件名称:DataObjectRelation.php
数据对象的规格说明默认定义变量如下:
- $field_spec:列规格定义说明
- $has_one:一对一关系说明
- $belong_has_one:从属一对一关系说明
- $has_many:一对多关系说明
- $many_many:多对多关系说明
- $belongs_many_many:从属于多对多关系说明
除第一个变量用于列规格说明外,其它变量都用于表[类]关系说明;
第一个变量为实例变量,其他关系变量都定义为静态类变量;
一般情况下数据对象无需定义规格说明,定义了规格说明以后,利用框架内置的规格说明实现功能,可以轻而易举实现很多功能,这在后面会进一步详细说明;
通过代码生成数据对象类说明的时候,会自动生成相应的数据对象的规格说明配置变量;
如果未按照[2.数据库原型设计规范]定义数据库,则需要按本文说明手动配置数据对象的规格说明配置变量。
详细说明
$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(
//类名=>外键名
//实例对象名=>外键名[在从属于一对一关系类名中经常遇到,比如家庭地址中省|市|区都关联同一个类:地区;需要用实例对象名]
)
);
基本定义
在数据对象的列规格里
1.$key->$value说明是:DataObject默认列名->列别名。
它主要用于与第三方WEB应用整合时,可能数据对象表唯一标识定义为$table_id,如用户表的唯一标识是:user_id;
在框架中设计当列名有别名时,以列别名去表中查找相应列。
2.remove:在数据对象中移除不需要持久化的列。
如数据对象中不需要列commitTime或者updateTime数据列时,只需要在其中声明,其中声明的列即不在框架的持久层中进行存储。
3.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.
4.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:一对一关系说明
基本定义
相对于[2.3.数据库定义]表关系定义:一对一[has_one]
例如示例项目中
主数据对象:User
从数据对象:Userdetail
用户[主数据对象]和用户详情[从数据对象]就是一对一关系
示例说明
定义示例:
class User extends DataObject {
static $has_one=array(
"userDetail"=> "UserDetail",
);
调用示例:
$user=User::get_by_id(1);
$userdetail=$user->userdetail;
print_r($userdetail);
$belong_has_one:从属一对一关系说明
基本定义
相对于[2.3.数据库定义]表关系定义:从属于一对一[belong_has_one]
例如示例项目中
主数据对象:User
从数据对象:Userdetail
用户详情[从数据对象]和用户[主数据对象]就是从属于一对一关系
示例说明
定义示例:
class Userdetail extends DataObject {
static $belongs_has_one=array(
"user"=>"User"
);
调用示例:
$userdetail=Userdetail::get_by_id(1);
$user=$userdetail->user;
print_r($user);
$has_many:一对多关系说明
基本定义
相对于[2.3.数据库定义]表关系定义:一对多[has_many]
例如示例项目中
主数据对象:Blog
从数据对象:Comment
博客[主数据对象]和评论[从数据对象]就是一对多关系
示例说明
定义示例:
class Blog extends DataObject {
static $has_many=array(
"comments"=> "Comment",
);
调用示例:
$blog=Blog::get_by_id(1);
$comments=$blog->comments;
print_r($comments);
$many_many:多对多关系说明
基本定义
相对于[2.3.数据库定义]表关系定义:多对多[many_many]
例如示例项目中
主数据对象:User
从数据对象:Role
多对多关系数据对象:Userrole
用户[主数据对象]和角色[从数据对象]就是多对多关系
示例说明
定义示例:
class User extends DataObject {
static $many_many=array(
"roles"=> "Role",
);
调用示例:
$user=User::get_by_id(1);
$roles=$user->roles;
print_r($roles);
$belongs_many_many:从属于多对多关系说明
基本定义
相对于[2.3.数据库定义]表关系定义:从属于多对多[belongs_many_many]
例如示例项目中
主数据对象:User
从数据对象:Role
多对多关系数据对象:Userrole
角色[从数据对象]和用户[主数据对象]就是从属于多对多关系
示例说明
定义示例:
class Role extends DataObject {
static $belongs_many_many=array(
"users"=>"User"
);
调用示例:
$role=Role::get_by_id(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 $idnameconcat='';
ID名称中的连接符。ID名称定义的策略为TABLENAME_ID有效。
public static $foreignid_name_strategy=EnumForeignIDNameStrategy::TABLENAME_ID;
Foreign ID名称定义的策略
$foreignidconcat='';
Foreign ID名称中的连接符。Foreign ID名称定义的策略为TABLENAME_ID有效。