三、实现你的mode层
model层,就是mvc模式中的数据处理层,用来进行数据和商业逻辑的装封,进行他的设计的时候设计到三个个概念:
------model类。是实体类。用来保存数据库表格的中一条记录的所有字段的数据。并且可以验证这条记录数据的完整性。
------modelmanager类。 是实体类的管理类。通常每一个实体类(model)都要有一个对应的管理类(modelmanager)。管理类可以用来管理实体类里面的数据纪录(例如删除/添加/更改.....)。 但是modelmanager类不一定要有对应的model类。
------db类。 用来管理对数据库的联接。 modelmanager类所有的对数据的操作。都是通过这个db类来实现的。 在整个mvc模式中。只有这个db类可以直接对数据库进行操作。同时也只有modelmanager类可以对db类进行调用。
看上去好象是比较麻烦。但是实际上并不复杂。这种model层设计方式。和网上购物系统的购物车程序是极其相似的。model可以看作是购物车里的单个商品的信息类。manager可以看作是订单。 订单是用来管理采购的商品的。
下面是一个简单的例子。应该是比较典型的。着重看他的整个设计和流程的实现。仔细研究一下。其实不难。
注意:下面例子使用的所有的类和方法都是经过简化的。实际情况比这个要复杂的多。但是。作为一个实例已经是足够用了。
文件夹结构:
|- db.php
|- model.php
|- manager.php
|- modeltest1.php
|- modeltest2.php
|- modeltest3.php
|- modeltest4.php
|- model /
|- model / classmodel.php
|- model / studentmodel.php
|- model / classmanager.php
|- model / studentmanager.php
注意文件夹和文件名的大小写
内容:假设有一个数据库,保存在两张表,一张是class(班级)表格,一张是student(学生)的表格,
class表格字段: cls_id----------int--------not null
cls_name--------string-----not null
cls_address-----string-----null
student表格字段:stu_id----------int--------not null
stu_clsid-------int--------not null
stu_name--------string-----null
classmodel.php 里面是class表的一个实体类classmodel
classmanager.php 里面是classmodel的管理类classmanager
studentmodel.php 里面是student表的一个实体类studentmodel
studentmanager.php 里面是studentmodel的管理类studentmanager
db.php 里面是一个数据库操作管理类,他和里面用的接口和正常使用情况是一样的, 但是本例只是模拟的实现了这个借口.因此,可以在不用真实数据库的情况下运行.
文件0:(model.php)model层实体的基础类
1, name=>this is name);
var $data;
//这个实体类的数据约束信息,用来判断加入的$data数据的准确性
//see: classmodel
var $match;
//与该实体对应的数据库中表的名称
var $table;
//初始化
function model(&$data){
$this->data = &$data;
}
//设置该实体的某个数据是值
function set($key, $value){
$this->data[$key] = $value;
}
//获取该实体的某个数据
function get($key){
return $this->data[$key];
}
//获取该实体的全部数据
function getdata(){
return $this->data;
}
//获取该实体的约束信息
function getmatch(){
return $this->match;
}
//验证实体数据的准确性和完整性
function isvalid(){
foreach($this->match as $key=>$value){
if(!isset($value[null]) && !isset($this->data[$key])) die($key 的数值不能为空);
//.....可以在加其他的判断,例如是否超过如许的最大数值,或长度过长.....
}
}
}
?>
文件1:(manager.php)model层进行实体管理的基础类
db = new db();
}
//用来向数据库中插入实体信息
function insert(&$model){
$model->isvalid();
$table = $model->table;
$match = $model->getmatch();
$data = $model->getdata();
$str1 = $str2 = array();
foreach($match as $key=>$value){
if(isset($data[$key])){
$str1[] = $key;
$str2[] = ($value[type]==c)? \.$data[$key].\: $data[$key];
}
}
$sql = insert into $table (.implode(,, $str1).) values(.implode(,, $str2).);
return $this->db->execute($sql);
}
}
?>
文件2:(classmodel.php)班级信息的实体类
true表示是准许为空,否则不能为空)
var $match = array(cls_id => array(name=>cls_id, type=>i),
cls_name => array(name=>cls_name, type=>c),
cls_address => array(name=>cls_address, type=>c, null=>true)
);
var $table = class;
//初始化
function classmodel(&$data){
parent::model($data);
}
//用来获取这个班级的学生的信息
function getstudent(){
require_once ./model/studentmanager.php;
$manager = new studentmanager();
$classid = $this->get(cls_id);
return $manager->getlist($classid);
}
}
?>
文件3:(studentmodel.php)学生信息的实体类
true表示是准许为空,否则不能为空)
var $match = array(stu_id => array(name=>stu_id, type=>i),
stu_clsid => array(name=>stu_clsid, type=>i),
stu_name => array(name=>stu_name, type=>c, null=>true)
);
var $table = student;
//初始化
function studentmodel(&$data){
parent::model($data);
}
}
?>
文件4:(classmanager.php)班级实体的管理类
db->query($sql);
}
//查找并返回一个班级的实体类
function &findonemodel($id){
$sql = select * form class where cls_id=$id;
$data = $this->db->getone($sql);
if($data==null) die(该班级不存在!);
require_once ./model/classmodel.php;
$model = new classmodel($data);
return $model;
}
}
?>
文件5:(studentmanager.php)学生实体的管理类
db->query($sql);
}
}
?>
文件6:(db.php)数据库联接管理类,用于共享并管理数据的访问。由于这个类涉及的内容不是本章要讨论的内容,所以这个类模拟了“真实的数据库管理类的方法”,借口是和正常的类是一样的,但是接口函数里面的内容是不对的,只是模拟的数据。网上有很多这种类的做法,可以自己到晚上找找,(**另外本系列文章的第二章里也有详细的介绍**)。
con=mysql_connect(********************);...........
}
//执行数据查询语句
function &query($sql){
//$result = mysql_query($sql); ..................
//return $result;
if($sql==select * from student where stu_clsid=2)
return array(0=>array(stu_id=>1, stu_clsid=>2, stu_name=>student1),
1=>array(stu_id=>2, stu_clsid=>2, stu_name=>student2)
);
die(空班级);
}
//获取一条数查询结果
function getone($sql){
//$result = mysql_query($sql); .............
//return $result[0];
if($sql==select * form class where cls_id=1)
return null;
if($sql==select * form class where cls_id=2)
return array(cls_id=>2, cls_name=>classname, cls_address=>classaddress);
}
//执行数据库更新/添加/删除语句
function execute($sql){
//mysql_query($sql);
echo
正在进行插入操作
...
插入操作完成
;
return true;
}
}
?>
测试文件一、(modeltest1.php)(查询班级标号(cls_id)为2的班级的学生的名单)
findonemodel($classid);
$data = &$model->getstudent();
foreach($data as $value)
echo 编号:.$value[stu_id]. ------ 姓名: .$value[stu_name].
;
?>
返回的结果是:
编号:1 ------ 姓名: student1
编号:2 ------ 姓名: student2
测试文件二、(modeltest2.php)(查询班级标号(cls_id)为1的班级的学生的名单)
findonemodel($classid);
$data = &$model->getstudent();
foreach($data as $value)
echo 编号:.$value[stu_id]. ------ 姓名: .$value[stu_name].
;
?>
返回的结果是:
该班级不存在!
测试文件三、(modeltest3.php)(执行数据库的插入工作,向student表添加数据)
3, stu_clsid=>2, stu_name=>student3);
require_once ./model/studentmodel.php;
$model = new studentmodel($data);
require_once ./model/studentmanager.php;
$manager = new studentmanager($data);
$result = $manager->insert($model);
echo $result?
插入操作成功: 插入操作失败;
?>
返回的结果是:
正在进行插入操作
...
插入操作完成
插入操作成功
测试文件四、(modeltest4.php)(执行数据库的插入工作,向student表添加数据)
3, stu_name=>student3);
require_once ./model/studentmodel.php;
$model = new studentmodel($data);
require_once ./model/studentmanager.php;
$manager = new studentmanager($data);
$result = $manager->insert($model);
echo $result?
插入操作成功: 插入操作失败;
?>
返回的结果是:
stu_clsid 的数值不能为空
结果分析:
studentmodel中match的规定stu_clsid的值是不能为空的,
而代码中代码中$data = array(stu_id=>3, stu_name=>student3);
缺少stu_clsid的值,因此不能通过数据的完整性校验,抱错.
