• ThinkPHP3.2.3学习笔记2---模型


    一、模型实例化
    1.直接实例化
    可以和实例化其他类库一样实例化模型类,例如:
    $User = new HomeModelUserModel();
    $Info = new AdminModelInfoModel();

    // 带参数实例化
    $New = new HomeModelNewModel('blog','think_',$connection);
    模型类通常都是继承系统的ThinkModel类,该类的架构方法有三个参数,分别是:
    Model(['模型名'],['数据表前缀'],['数据库连接信息']);
    三个参数都是可选的,大多数情况下,我们根本无需传入任何参数即可实例化。

    参数 描述
    模型名 模型的名称 和数据表前缀一起配合用于自动识别数据表名称
    数据表前缀 当前数据表前缀 和模型名一起配合用于自动识别数据表名称
    数据库连接信息 当前数据表的数据库连接信息 如果没有则获取配置文件中的

    2.D方法实例化
    上面实例化的时候我们需要传入完整的类名,系统提供了一个快捷方法D用于数据模型的实例化操作。
    要实例化自定义模型类,可以使用下面的方式:

    <?php
    //实例化模型
    $User = D('User');
    // 相当于 $User = new HomeModelUserModel();
    // 执行具体的数据操作
    $User->select();
    ?>

    当 HomeModelUserModel 类不存在的时候,D函数会尝试实例化公共模块下面的 CommonModelUserModel 类。
    D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的,例如:
    参数 实例化的模型文件(假设当前模块为Home)
    User 对应的模型类文件的 HomeModelUserModel.class.php
    UserType 对应的模型类文件的 HomeModelUserTypeModel.class.php

    如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写。

    D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的ThinkModel基类,同时对于已实例化过的模型,不会重复去实例化。


    3.M方法实例化模型
    D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。

    例如:
    // 使用M方法实例化
    $User = M('User');
    // 和用法 $User = new ThinkModel('User'); 等效
    // 执行其他的数据操作
    $User->select();

    M方法也可以支持跨库操作,例如:
    // 使用M方法实例化 操作db_name数据库的ot_user表
    $User = M('db_name.User','ot_');

    // 执行其他的数据操作
    $User->select();

    M方法的参数和ThinkModel类的参数是一样的,也就是说,我们也可以这样实例化:
    $New = M('new','think_',$connection);
    // 等效于 $New = new ThinkModel('new','think_',$connection);

    具体的参数含义可以参考前面的介绍。

    M方法实例化的时候,默认情况下是直接实例化系统的ThinkModel类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法:
    $User = M('HomeModelCommonModel:User','think_','db_config');
    // 相当于 $User = new HomeModelCommonModel('User','think_','db_config');

    如果你的模型类有自己的业务逻辑,M方法是无法支持的,就算是你已经定义了具体的模型类,M方法实例化的时候是会直接忽略。

    4.实例化空模型类
    如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
    //实例化空模型
    $Model = new Model();
    //或者使用M快捷方法是等效的
    $Model = M();
    //进行原生的SQL查询
    $Model->query('SELECT * FROM think_user WHERE status = 1');

    实例化空模型类后还可以用table方法切换到具体的数据表进行操作

    我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。

    二、CRUD测试
    Application/Home/Controller/UserController.class.php

     1 <?php
     2 namespace HomeController;
     3 use ThinkController;
     4 class UserController extends Controller {
     5     //注意,这里只能用D('User') 不能用 M('User'),因为这里是需要实例化某个具体的模型类User
     6     protected $userObj;
     7 
     8     public function getUserObj() {
     9         return $this->userObj = D('User');
    10     }
    11 
    12     //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/getUserInfo
    13     public function getUserInfo() {
    14         $this->userObj = $this->getUserObj();
    15 
    16         var_dump($this->userObj->getUserInfo());
    17         echo 'realpath:' . realpath('Controller.class.php');
    18         $included_files = get_included_files();
    19         var_dump($included_files);
    20         echo file_exists('Controller.class.php') ? 'class Controller exists' : 'class Controller not exists';
    21     }
    22 
    23     //添加数据
    24     //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/add
    25     public function add() {
    26         $this->userObj = $this->getUserObj();
    27 
    28         $ret = $this->userObj->addUser();
    29         echo true ? "ret: $ret, add data succeed": "ret: $ret, add data failed";
    30     }
    31 
    32     //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/edit/user_id/1
    33     public function edit($user_id = 1) {
    34         $this->userObj = $this->getUserObj();
    35 
    36         $user_id = intval($user_id);
    37         if ($user_id < 0) $user_id = I('user_id', '', 'intval');
    38 
    39         //如果在正式的应用中,如果参数值user_id来自用户的输入,且用户输入的数据格式不正确,需要将错误提示信息反馈给用户
    40         if ($user_id < 0) return false;
    41 
    42         $ret = $this->userObj->editUser($user_id);
    43         //var_dump($ret); //bool(true)
    44         echo $ret === true ? "ret: $ret, edit data succeed": "ret: $ret, edit data failed";
    45     }
    46 
    47     //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/delete/user_id/16
    48     public function delete($user_id = 1) {
    49         $this->userObj = $this->getUserObj();
    50 
    51         $user_id = intval($user_id);
    52         if ($user_id < 0) $user_id = I('user_id', '', 'intval');
    53 
    54         //如果在正式的应用中,如果参数值user_id来自用户的输入,且用户输入的数据格式不正确,需要将错误提示信息反馈给用户
    55         if ($user_id < 0) return false;
    56 
    57         $ret = $this->userObj->deleteUser($user_id);
    58         //var_dump($ret); //bool(true)
    59         echo $ret === true ? "ret: $ret, delete data succeed": "ret: $ret, delete data failed";
    60     }
    61 }
    62 ?>


    Application/Home/Model/UserModel.class.php

     1 <?php
     2 namespace HomeModel;
     3 use ThinkModel;
     4 class UserModel extends Model {
     5     protected $trueTableName = '99game_user';
     6     protected $userObj;
     7 
     8     public function getUserObj() {
     9         return $this->userObj = M('User', '99game_');
    10     }
    11 
    12     //The R of CRUD
    13     public function getUserInfo() {
    14         //在模型层里面,直接通过$this对象即可以直接进行查询, 如果在模型层以外操作数据库,需要首先实例化
    15         $this->userObj = $this->getUserObj();
    16 
    17         $rows = $this->userObj->where('level=1')->select();
    18         return $rows;
    19     }
    20 
    21     //The C of CRUD
    22     //true: 添加数据成功, false: 添加数据失败
    23     public function addUser() {
    24         $this->userObj = $this->getUserObj();
    25 
    26         //正常情况下这些数据一般从web界面中输入,这里为了方便测试,随机生成一些数据
    27         $randId = rand(10000, 99999);
    28         $data['email'] = 'caihf_' . $randId . '@qq.com';
    29         $data['password'] = '123456_' . $randId;
    30         $data['token'] = '123token456_' . $randId;
    31 
    32         //插入数据的时候, 如果主键是自动增长型,则add方法的返回值是自增型字段的值
    33         $ret = $this->userObj->add($data);
    34 
    35         //方法_sql用于返回刚才执行的sql语句
    36         echo "sql: " . $this->userObj->_sql() . "
    ";
    37 
    38         return (int)$ret > 0 ? true : false;
    39     }
    40     
    41     //The U of CRUD
    42     /**
    43      * 修改用户信息
    44      * @return true: 修改用户信息成功, false: 修改用户信息失败
    45      */
    46     public function editUser($user_id = 1) {
    47         $this->userObj = $this->getUserObj();
    48 
    49         $randId = rand(10000, 99999);
    50         $data['email'] = 'caihf_' . $randId . '@qq.com';
    51         $data['password'] = '123456_' . $randId;
    52         $data['token'] = '123token456_' . $randId;
    53 
    54         //注意:save方法的返回值是影响的记录数,如果返回false则表示更新出错,因此一定要用恒等来判断是否更新失败。
    55         $ret = $this->userObj->where("user_id=$user_id")->save($data);
    56 
    57         //方法_sql用于返回刚才执行的sql语句
    58         //比如UPDATE `99game_user` SET `email`='caihf_82482@qq.com',`password`='123456_82482',`token`='123token456_82482' WHERE ( user_id=1 )
    59         //UPDATE `99game_user` SET `email`='caihf_61039@qq.com',`password`='123456_61039',`token`='123token456_61039' WHERE ( user_id=3 )
    60         echo "sql: " . $this->userObj->_sql() . "
    ";
    61 
    62         return (int)$ret > 0 ? true : false;
    63     }
    64 
    65     ////The D of CRUD
    66     /**
    67      * 删除用户信息
    68      * @return true: 删除用户信息成功, false: 删除用户信息失败
    69      */
    70     public function deleteUser($user_id = 1) {
    71         $this->userObj = $this->getUserObj();
    72 
    73         //注意:delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。
    74         $ret = $this->userObj->where("user_id=$user_id")->delete();
    75 
    76         //方法_sql用于返回刚才执行的sql语句
    77         //DELETE FROM `99game_user` WHERE ( user_id=16 )
    78         echo "sql: " . $this->userObj->_sql() . "
    ";
    79 
    80         return (int)$ret > 0 ? true : false;
    81     }
    82 }
    83 ?>

    控制器UserController中的4个有关CRUD方法均正确测试通过,另外CRUD操作数据库的写法多种多样,千变万化,ThinkPHP开发手册写得非常详细,只要认真阅读,仔细测试,加上一定的时间,基本上都可以学习怎么使用。

  • 相关阅读:
    POJ 3660 Cow Contest
    HDOJ 2093 sscanf的使用,字符串对齐,快排
    HDOJ 2091 空格的特殊输入输出格式
    COJ 1081: 集训队分组
    HDOJ 2948 错排公式
    POJ 1936 All in All
    POJ 1035 Spell checker
    HDOJ 2094 set和map的使用
    HDOJ 2036 多边形的面积
    HDOJ 1166 敌兵布阵
  • 原文地址:https://www.cnblogs.com/caihuafeng/p/5353614.html
Copyright © 2020-2023  润新知