注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

牧野流星

每个人心中都有一个梦想..........

 
 
 

日志

 
 

ThinkPHP框架之模型  

2013-11-08 08:52:38|  分类: ThinkPHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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属性,就必须使用子类模型     

<formmethod=’post’>

       <input type=’text’name=’username’>

       <inputtype=’text’ name=’password’>

</form>

 

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

  评论这张
 
阅读(145)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018