php 模型实例化报错,ThinkPHP框架之模型

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();     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值