一、 模型
1、 什么是模型
模型表示企业数据和业务规则
2、 定义模型
Lib/Model下
文件命名规则:
表名(首字母大写)Model.class.php
模型内代码:
class 表名(首字母大写)Model extends Model{
}
在tp中,如果没有特殊的业务要求,可以直接使用Model类,而不需要定义子类模型,但推荐使用子类模型(自定义模型)
数据表:
文件:
代码:
我们尝试去实例化这个模型类对象:
运行:
说明:tp中的模型,被实例化的同时会自动创建与数据库连接
3、 配置数据库信息
在配置文件config.php中,添加以下信息
再重新运行以上程序:
看到上图,说明配置信息添加成功。
通过上图,可以看出,tp模型被实例化时,会自动解析当前模型对应的数据表的表结构
4、 实例化模型对象
我们目前使用的模型主要分两种:
1) 自定义模型
GoodsModel
UserModel
2) 基础模型
在tp中,实例化模型主要有两种形式:
1) 直接实例化
$goods=new GoodsModel();
2) 快速实例化
$goods=D(‘Goods’);
tp 中实例化模型的四种方式:
1) 直接实例化用户自定义模型
2) 快速实例化用户自定义模型
3) 直接实例化基础模型
4) 快速实例化基础模型
5、 CURD操作
l 创建操作(Create)
l 读取数据(Read)
l 更新数据(Update)
l 删除数据(Delete)
1) 创建操作
$admin=new AdminModel();
$row=array(
‘name’=>‘zhangsan’,
‘age’=>30 );
$admin->add($row);
2) 更改操作
$admin=new AdminModel();
$data=array();
$admin->save($data);
3) 删除操作
$admin=new AdminModel();
$admin->delete(‘4,5,6’)
4) 查询操作
select();
查询多条数据时使用,结果永远是一个二维数组,即使结果只有一条数据
find();
永远返回一条数据,所以返回值是一个一维数组
运行:
6、 字段缓存
当实例化模型对象时,会自动将这个对应的表中的字段信息缓存下来
l 字段缓存保存在Runtime/Data/_fields/ 目录下面
l 只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。
l 可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存
l 可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模型类里面添加fields属性即可
7、 字段定义
在子类模型中,使用以下属性定义表中所有字段信息
语法:
l protected $fields=array(
‘id’,
‘username’,
‘password’,
‘_pk’=>‘id’,
‘_autoinc’=>true
);
模型:
定义字段时是定义在子类模型中,但如果实例化父类模型,那么程序还会重新解析表结构。
如果使用定义字段功能,那么实例化时必须使用子类模型。
8、 创建数据
ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显。
语法:
l 从表单中创建数据
$User->create();
l 从数组中创建数据
$User->create($data);
控制器:
当对象调用create方法时,这个方法默认会从$_POST获取数据,再将这个数据放在$category对象的data属性中,当对象调用add方法时,如果没有向函数传递参数,那么会自动从这个对象data属性中读取数据,并完成录入。
create方法的本质是从一个数组中创建数据。
如果一个表单以get形式提交数据,我们也想使用创建数据的功能,可以使用
$category->create($_GET);
创建数据功能必须依赖一个条件:
表单中元素的名字必须和数据表中的名字保持一致,但这样一来,会在客户端源文件暴露数据表结构的真实字段名,如何解决?
9、 字段映射
ThinkPHP的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能
语法:
protected $_map = array(
‘name' => ‘username',
‘pwd’ => ‘userpwd’
‘假名’ => ‘真名’
);
模型:
字段映射原理:
$data = $User->parseFieldsMap($data);
可以看出,如果type的值为1,表示将真名元素转为假名元素
如果type的值为0,表示将假名元素转为真名元素