ThinkPHP
一、模型
1、 什么是模型
数据表的一个实体
所有数据均来自模型
业务规则(增删改查)
2、 定义规则
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的后缀定义Model
位置: /Lib/Model
UserModel
UserTypeModel
比如说,我们有一个表叫think_product
ProductModel
在控制器中尝试实例化该模型对象,会报错,连接数据失败。
通过以上代码,我们得出一个结论:在tp中,当我们创建一个模型对象时,tp会自动创建与数据库的连接
当我们实例化一个子类模型对象,会执行父类模型Model中的构造函数,在Model中的构造函数里,它去将Model中的db属性实例化为db类的类对象,当db类对象被实例化时会自动与数据建立连接
如何解决?
必须在配置文件中配置好数据库相关信息
通过观察,打印出来的对象,具有以下特点:
1) 具有db属性,从父类模型继承过来的,它是DbMySql类的实例
2) 当创建模型对象时,那么,这个程序会自动分析我们当前表的表结构
3) 分析完表结构之后,会将当前表结构存储在当前模型对象的$fields属性中,这个属性也是从父类模型继承过来的,它是以数组形式体现,记录的内容有:字段名、主键字段、是否自动增长
4) 如果开启字段缓存,会将表结构缓存到文件中,便于下次引用
3、 实例化
在tp中,模型分为两种:
用户自定义模型
$student = new StudentModel();
$student = D ('Student');
基础模型(Model)
$student = new Model('student');
如果有特殊需求,那么自定义模型并实例化
如果没有特殊要求,可以直接使用Model
实例化时也有两种方式:
实例化模型(实例化子类或父类Model)
快速实例化(简写函数 D、M)
4、 关于相关的配置选项
l DB_TYPE :数据库类型
l DB_HOST :服务器地址
l DB_USER :用户名
l DB_PWD :密码
l DB_NAME :数据库名
l DB_PREFIX :数据库表前缀
l DB_PORT :服务端口 如果是3306,这里可以添空 ‘’
l DB_CHARSET :编码
5、 关于增删改查的快速入门
add(); delete(); save(); select();
6、 定义字段
l 字段缓存保存在Runtime/Data/_fields/ 目录下面
开启调试不会缓存字段文件。同时字段缓存可以单独设置。
在配置文件中,'DB_FIELDS_CACHE' => true, // 启用字段缓存,改成false即可。
数据库.数据表.php
l 只要是不开启调试模式都会生成字段缓存(字段缓存可以单独设置关闭)。
开启调试不会生成字段缓存文件
如果关闭调试,并且关闭字段缓存,说明每次都需要动态解析表结构,如果项目处于开发阶段,并且数据库结构经常改变,可以考虑这么做。
l 可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存
l 可以在模型类里面手动定义数据表字段的名称,可以避免IO加载的效率开销,在模
l 型类里面添加fields属性即可
如果关闭调试,关闭字段缓存,那说明是每次实例化时动态解析表结构
如果开启字段缓存功能,说明每次都加载字段缓存文件
如果不需要动态解析或加载缓存文件,可以考虑在模型类中定义$fields的属性指定所有字段列表
//在关闭了字段缓存功能后,在模型中自定义了表结构:
//打印对象发现其中有一个fields的属性,是子类模型中定义的
//在打印出的内容里没有看到show column的语句
//说明没有动态解析
//提升了效率
7、 创建数据, 即表单提交数据,
实例化子类模型才会拥有自己定义的fields属性,实例化基础模型不会有这个属性,最终程序还是会动态解析表结构,所有,
如果定义了
fields
属性,就必须使用子类模型
$_POST[’username’]
$_POST[’password’]
比如说,一个表有50个字段,像上面的代码进行取值比较繁琐,如何解决?
用tp中的创建数据功能来解决这个问题
ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显。
Create方法是默认是从$_POST获取数据
执行完create方法后,当前模型对象的data属性里保存的就是提交的所有数据
如果表单以get形式提交的
Create方法可以从一个数组中获取数据
$student->create($_GET);
$student->create(array());
public function addok(){
$student = new StudentModel();
$student->create();//默认从$_POST中取数据
var_dump($student);
$student->add();//此时没有传递array数组
}
在上一题中,如果表中有哪些字段,那么,表单中就必须使用相同的字段名称,但是这样一来,会在客户端源文件中暴露真实的字段名称,会给服务器带来安全隐患,如何解决? 8、字段映射
ThinkPHP的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能
我们可以在子类模型中,添加如下代码:
l protected $_map = array(
‘name' => ‘username',
‘pwd’ => ‘userpwd’
假名 真名
);
然后,将表单内容修改如下:
再次运行程序,可以录入成功!
如果我们得到了表中数据,如何将数据中的字段转成假名?
9、表名操作
l 在一个数据库中,如果部署了多个项目,那么我们可以使用表前缀解决问题
项目A:
Admin
项目B:
Admin
在配置文件中,使用下面这个选项来设置表前缀
‘DB_PREFIX'=>‘think_’
think_product
think_product_type
1)比如说:我们有一个表叫think_students,那么定义模型时
Class StudentsModel
但是由于一些特殊原因:我只想把名称改为
Class StudentModel
可以在模型中使用tableName来设置
2)比如说:我们项目中一个表没有表前缀,那么如何定义模型?
Think_
Think_
Product
可以在模型中定义trueTableName来设置
反复修改表名,运行上面代码,观察变化。
1)表名为:think_products,模型是 productModel
使用tableName属性
2)表名为products,模型是 ProductModel
使用trueTableName属性
10、事务处理
$User->startTrans()
开启事务
$User->commit()
提交事务
$User->rollback()
回滚事务
11、ActiveRecord 注意与普通方式的区别
AR模式--也可以叫ER模式
我们项目中有若干个事物,每个事物对应一个表
将表映射到类
将记录映射到对象
将字段映射到对象属性
class Person{
// private$name;
// private$age;
private$data=array();
// publicfunction setName($value){$this->name=$value}
// publicfunction getName(){return $this->name}
Public function __set($name,$value){
// $this->$name=$value;
$this->data[$name]=$value;
$this->data[‘age’]=30;
}
Public function __get($name){
Return$this->$name;
}
public function insert(){
insertinto person values(null,‘$this->data[name]’,’$this->data[age]’):
}
}
$person=new Person();
$person->name=’zhangsan’;
$person->age=30;
$person->insert();
1) 增加
public function test3(){
$stu = new StuModel();
$stu->name = 'hello';
$stu->age = 33;
$stu->add();
}
2) 修改
/**
* AR模式操作数据库
*/
public function test4(){
$stu = new StuModel();
$stu->id = 2;
$stu->name = 'hell';
$stu->age = 44;
$stu->save();
}
3) 删除
/**
* AR模式操作数据库
*/
public function test5(){
$stu = new StuModel();
$stu->id = 2;
$stu->delete();
}
4) 查询
/**
* AR模式操作数据库
*/
public function test6(){
$stu = new StuModel();
$stu->id = 1;
//从对象中获取
$stu->find();
echo $stu->name;
echo $stu->age;
}
/**
* AR模式操作数据库
*/
public function test7(){
$stu = new StuModel();
//$stu->id = 1;
//从对象中获取
//$stu->find();
$list = $stu->select();
var_dump($list);
}
12、CRUD操作
创建操作(Create)
读取数据(Read)
更新数据(Update)
删除数据(Delete)
1) 创建操作
/**
* CRUD操作
*/
public function test8(){
$stu = new StuModel();
/* //第一种方式
$arr = array (
'name' => 'lisi',
'age' => 33,
);
$stu->add($arr); */
/* //第二种方式(表单提交的方式)
$stu->create ( array (
'name' => 'zhangsan',
'age' => 26
) );//默认从$_POST中接收数据
$stu->add(); */
//第三种方式--一次性插入多条
$dataList = array(array (
'name' => 'wangwu',
'age' => 22
),array (
'name' => '小李子',
'age' => 44
));
$stu->addAll($dataList);
}
2)修改操作
/**
* CRUD操作
*/
public function test9(){
$stu = new StuModel();
/* //第一种方式
$stu->create ( array (
'id' =>3,
'name' => 'xxxx',
'age' => 66
) );
$stu->save(); */
$stu->save ( array (
'id' => 3,
'name' => 'uuuuu',
'age' => 55
) );
}
3)删除操作
/**
* CRUD操作--D
*/
public function test10(){
$stu = new StuModel();
//第一种方式
$stu->delete(4);
//第二种方式
$stu->delete('5,6,7,8');
}
4)查询操作
/**
* CRUD操作--R
*/
public function test11(){
$stu = new StuModel();
//第一种方式
$row = $stu->find(2);
print_r($row);
//第二种方式
$list = $stu->select();
print_r($list);
}
另外一种用法:
public function test12(){ $stu = D ('students'); $stu->find(4); $stu->name ='test'; $stu->save(); }