一、模型实例化
1.直接实例化
可以和实例化其他类库一样实例化模型类,例如:
$User = new \Home\Model\UserModel();
$Info = new \Admin\Model\InfoModel();
// 带参数实例化
$New = new \Home\Model\NewModel(‘blog‘,‘think_‘,$connection);
模型类通常都是继承系统的\Think\Model类,该类的架构方法有三个参数,分别是:
Model([‘模型名‘],[‘数据表前缀‘],[‘数据库连接信息‘]);
三个参数都是可选的,大多数情况下,我们根本无需传入任何参数即可实例化。
参数 描述
模型名 模型的名称 和数据表前缀一起配合用于自动识别数据表名称
数据表前缀 当前数据表前缀 和模型名一起配合用于自动识别数据表名称
数据库连接信息 当前数据表的数据库连接信息 如果没有则获取配置文件中的
2.D方法实例化
上面实例化的时候我们需要传入完整的类名,系统提供了一个快捷方法D用于数据模型的实例化操作。
要实例化自定义模型类,可以使用下面的方式:
<?php
//实例化模型
$User = D(‘User‘);
// 相当于 $User = new \Home\Model\UserModel();
// 执行具体的数据操作
$User->select();
?>
当 \Home\Model\UserModel 类不存在的时候,D函数会尝试实例化公共模块下面的 \Common\Model\UserModel 类。
D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的,例如:
参数 实例化的模型文件(假设当前模块为Home)
User 对应的模型类文件的 \Home\Model\UserModel.class.php
UserType 对应的模型类文件的 \Home\Model\UserTypeModel.class.php
如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写。
D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的\Think\Model基类,同时对于已实例化过的模型,不会重复去实例化。
3.M方法实例化模型
D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。
例如:
// 使用M方法实例化
$User = M(‘User‘);
// 和用法 $User = new \Think\Model(‘User‘); 等效
// 执行其他的数据操作
$User->select();
M方法也可以支持跨库操作,例如:
// 使用M方法实例化 操作db_name数据库的ot_user表
$User = M(‘db_name.User‘,‘ot_‘);
// 执行其他的数据操作
$User->select();
M方法的参数和\Think\Model类的参数是一样的,也就是说,我们也可以这样实例化:
$New = M(‘new‘,‘think_‘,$connection);
// 等效于 $New = new \Think\Model(‘new‘,‘think_‘,$connection);
具体的参数含义可以参考前面的介绍。
M方法实例化的时候,默认情况下是直接实例化系统的\Think\Model类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法:
$User = M(‘\Home\Model\CommonModel:User‘,‘think_‘,‘db_config‘);
// 相当于 $User = new \Home\Model\CommonModel(‘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 Home\Controller; 3 use Think\Controller; 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 Home\Model; 3 use Think\Model; 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() . "\n"; 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`=‘[email protected]‘,`password`=‘123456_82482‘,`token`=‘123token456_82482‘ WHERE ( user_id=1 ) 59 //UPDATE `99game_user` SET `email`=‘[email protected]‘,`password`=‘123456_61039‘,`token`=‘123token456_61039‘ WHERE ( user_id=3 ) 60 echo "sql: " . $this->userObj->_sql() . "\n"; 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() . "\n"; 79 80 return (int)$ret > 0 ? true : false; 81 } 82 } 83 ?>
控制器UserController中的4个有关CRUD方法均正确测试通过,另外CRUD操作数据库的写法多种多样,千变万化,ThinkPHP开发手册写得非常详细,只要认真阅读,仔细测试,加上一定的时间,基本上都可以学习怎么使用。