5.模型层
模型层,作为MVC模型中的底层,对于程序的作用是至关重要的。目前许多框架都带有ORM的功能。ORM就是Object Relational Mapping,就一种对象和关系数据库进行互相转换的中间层。有了这个框架,我们实现程序以不关心SQL语句的书写、索引的创建、主键和外键的关系。虽然这是非常方便的功能,但由于隐藏了底层的实现,如果出现了错误,会不知所措。所以我还是强烈自己写一个模型层框架,只对简单的插入、删除、查询做一些封装,复杂的内容,例如表的关联等,均采用手写SQL的方式。以下是我抽象出来的框架,具体实现代码没贴上,可以从附件的程序源代码中找到。
需要说明的是,Cache是保存在文件系统中的,目的是减少查询次数(例如首页文章,会经常被查询。如进行缓存,可以大大提高系统速度。)由于PHP没有内建的内存缓存机制,只能通过文件(memcache不在本文讨论之内,如大家有兴趣,可以google之)。
至此,MVC模型的三大部分均介绍完毕。希望通过这篇文章,大家对PHP开发和MVC模型有一个新的认识。鉴于本人知识有限,在如此短的时间内写出此文,肯定会纰漏百出。可以通过邮件:
future0906[AT]gmail[DOT]com或跟贴与我联系。
欢迎大家转载,转载时请注明出处,谢谢!
注:附件1是学生时代写的基于MVC的日历备忘程序,仅供参考。
附件2是本文所描述的博客系统全部代码,仅供学习,如需作它用,请知会我一声。
另,由于我暂时无权限发附件和链接,请需要以上两个附件的朋友email或PM我。
模型层,作为MVC模型中的底层,对于程序的作用是至关重要的。目前许多框架都带有ORM的功能。ORM就是Object Relational Mapping,就一种对象和关系数据库进行互相转换的中间层。有了这个框架,我们实现程序以不关心SQL语句的书写、索引的创建、主键和外键的关系。虽然这是非常方便的功能,但由于隐藏了底层的实现,如果出现了错误,会不知所措。所以我还是强烈自己写一个模型层框架,只对简单的插入、删除、查询做一些封装,复杂的内容,例如表的关联等,均采用手写SQL的方式。以下是我抽象出来的框架,具体实现代码没贴上,可以从附件的程序源代码中找到。
001 | class BaseModel |
002 | { |
003 | /* |
004 | 模型对应的表名,不包含前缀 |
005 | @var string |
006 | */ |
007 | protected $mTableName ; |
008 | /* |
009 | 模型对应的表名,包含前缀 |
010 | @var string |
011 | */ |
012 | protected $mFullTableName ; |
013 | /* |
014 | 模型对应关系表中的属性列表 |
015 | 数组中每一个元素代表一个属性,关联数组的key代表属性名,value代表类型 |
016 | ColumnName=>Type |
017 | @var array |
018 | */ |
019 | protected $mColumn ; |
020 | /* |
021 | 主键名 |
022 | @var string |
023 | */ |
024 | protected $mPrimaryKey ; |
025 | /* |
026 | 标识该对象与其他对象是否有一对一的关系 |
027 | 该属性是一个数组,关联数组的key代表自己的属性,value代表另外对象的属性 |
028 | value的格式应该是:表名.属性名 |
029 | @var array |
030 | */ |
031 | protected $mOneToOne ; |
032 | /* |
033 | 标识该对象与其他对象是否有一对多的关系 |
034 | 该属性是一个数组,关联数组的key代表自己的属性,value代表另外对象的属性 |
035 | value的格式应该是:表名.属性名 |
036 | @var array |
037 | */ |
038 | protected $mOneToMore ; |
039 | /* |
040 | 表示与某一个的某个字段的一一对应关系 |
041 | 查找时查询将会自动将链接的字段查询出来 |
042 | @var array |
043 | */ |
044 | protected $mTableLink ; |
045 | /* |
046 | 数据库操作对象 |
047 | @var DBO |
048 | */ |
049 | protected $mrDbo ; |
050 | /* |
051 | 缓存保存对象 |
052 | @var array |
053 | */ |
054 | protected $mCache ; |
055 | /* |
056 | 缓存目录 |
057 | @var string |
058 | */ |
059 | private $mCacheDir ; |
060 | /* |
061 | 缓存文件名 |
062 | @var string |
063 | */ |
064 | private $mCacheFile ; |
065 | /* |
066 | 要缓存的SQL语句的结果 |
067 | @var string |
068 | */ |
069 | private $mCacheSql ; |
070 | /* |
071 | 为该对象创建一个新的记录 |
072 | 需要注意的是,该方法并不验证数据的正确性和对数据过滤 |
073 | 请在控制器中调用相应的方法对数据进行过滤 |
074 | 必须注意,目前还没实验对所属的表进行级联插入 |
075 | @param oneRow 数组 |
076 | */ |
077 | public function Create( $oneRow ) |
078 |
079 | /* |
080 | 查找数据,数据并不马上返回,通过其他方法提取数据 |
081 | $fields表示要查找哪几个字段 |
082 | $sort表示对根据哪些字段进行排序 |
083 | @param condition string |
084 | @param where string |
085 | @param orderby string |
086 | @param limit string |
087 | @param linkTable string |
088 | @return null |
089 | */ |
090 | public function Find( $fields = '*' , $where = null, $orderBy = null, $limit =null, $linkTable = null) |
091 | /* |
092 | 查找数据,数据马上通过该函数返回 |
093 | @param condition string |
094 | @param where string |
095 | @param orderby string |
096 | @param limit string |
097 | @param linkTable string |
098 | @return array |
099 | */ |
100 | public function FindAll( $fields = '*' , $where = null, $orderBy = null, $limit =null, $linkTable = null) |
101 | /* |
102 | 提取下一行数据 |
103 | @param type int |
104 | */ |
105 | public function GetOneRow( $type =1) |
106 | /* |
107 | 获取第一个记录的第一列 |
108 | */ |
109 | public function GetOne() |
110 | /* |
111 | 提取所有数据 |
112 | */ |
113 | public function GetAllRow() |
114 | /* |
115 | 更新某一行的数据,参数中的row必须包含主键,而且是依据主键更新该行 |
116 | @param row arry |
117 | */ |
118 | public function Update( $oneRow , $where = null) |
119 | /* |
120 | 更新某一行的某一个字段 |
121 | @param match array 匹配条件 |
122 | @param field 字段名 |
123 | @param value 属性值 |
124 | */ |
125 | public function UpdateOne( $match , $field , $value ) |
126 | /* |
127 | 数据保存方法,检查是否设置主键,若已设置,则调用更新,否则调用Create |
128 | @param row array |
129 | */ |
130 | public function Save( $oneRow ) |
131 | /* |
132 | 删除给定的数据行 |
133 | @param oneRow array |
134 | */ |
135 | public function Delete ( $oneRow , $trans =false, $cascade =false) |
136 | /* |
137 | 批量删除给定的数据行 |
138 | @param rows array |
139 | */ |
140 | public function DeleteBatch( $rows ) |
141 | /* |
142 | 初始化缓存 |
143 | @param cache_file 缓存的文件名 |
144 | @param cache_sql 缓存的SQL语句 |
145 | @param dbo 数据库操作对象 |
146 | */ |
147 | public function InitCache( $cache_file , $cache_sql ) |
148 | /* |
149 | 更新缓存,从数据库中取出数据 |
150 | */ |
151 | public function UpdateCache() |
152 | /* |
153 | 获取缓存内容 |
154 | @return array |
155 | */ |
156 | public function &GetCache() |
157 | } |
至此,MVC模型的三大部分均介绍完毕。希望通过这篇文章,大家对PHP开发和MVC模型有一个新的认识。鉴于本人知识有限,在如此短的时间内写出此文,肯定会纰漏百出。可以通过邮件:
future0906[AT]gmail[DOT]com或跟贴与我联系。
欢迎大家转载,转载时请注明出处,谢谢!
注:附件1是学生时代写的基于MVC的日历备忘程序,仅供参考。
附件2是本文所描述的博客系统全部代码,仅供学习,如需作它用,请知会我一声。
另,由于我暂时无权限发附件和链接,请需要以上两个附件的朋友email或PM我。
全文完