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

一、模型实例化
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开发手册写得非常详细,只要认真阅读,仔细测试,加上一定的时间,基本上都可以学习怎么使用。

时间: 2024-10-05 09:17:26

ThinkPHP3.2.3学习笔记2---模型的相关文章

学习笔记-CIFAR10模型理解简述

学习笔记-CIFAR10模型理解简述 整个结构中包含三个convolution layer.三个pooling layer和两个fully connected layer. 每个层有多个Feature Map,每个Feature Map通过一种卷积滤波器提取输入的一种特征,然后每个Feature Map有多个神经元. 首先是数据层,测试数据100张为一批(batch_size),后面括号内是数据总大小.如100*32*32*3= 307200 Top shape: 100 3 32 32 (30

CSS学习笔记——盒模型,块级元素和行内元素的区别和区别

今天本来打算根据自己的计划进行前端自动化的学习的,无奈早上接到一个任务需求需要新增一个页面.自从因为工作需要转前端之后,自己的主要注意力几 乎都放在JavaScript上面了,对CSS和HTML这方面其实基础真的很差,今天在写页面的时候就被浮动啊.内外边距啊这些耽误了不少时间. 反思一下,自己确实在这些基础方面的不足很多,所以今后的学习笔记主要是我在工作中遇到的一些问题和他们的解决方法.其中可能中会有JS.CSS.HTML各方面的,我会把自己每一天学到的内容都记录一下,辅助自己打好基础. 今天在

ThinkPHP3.2.3学习笔记1---控制器

ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性.并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性.扩展性和性能方面不断优化和改进. ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为Th

【机器学习 第2章 学习笔记】模型评估与选择

1.训练误差:学习器在训练集上的误差,也称“经验误差” 2.泛化误差:学习器在新样本上的误差 显然,我们的目标是得到在新样本上表现更好的学习器,即泛化误差要小 3.过拟合:学习器把训练样本学的太好了,导致泛化性能下降(学过头了...让我联想到有些人死读书,读死书,僵化,不懂得变通和举一反三) 原因:学习能力过于强大,把一些不太一般的特性也学了进来 针对措施:不好解决,是机器学习面临的关键障碍 4.欠拟合:就是连训练集都没学好,更别说泛化了(有点管中窥豹,盲人摸象的意思). 原因: 学习能力低下

Direct-X学习笔记--X模型导入

一.介绍 经历了之前手写立方体的痛苦过程,终于到了网格模型这一步.我们做游戏的时候肯定不能只用立方体呀,想要复杂的人物模型肯定是需要美工同学们使用专业的工具才能创建出来的,这些模型文件中定义好了网格模型的形状以及材质纹理等信息,我们所要做的只是读取这个文件,然后就可以根据文件中的信息创建复杂的模型啦!然而说白了,这些东东DX已经为我们定义好了,我们背一背API就行啦! 创建这些模型一般用3DMAX或者Maya软件,然而我作为一个程序都写不太明白的人,并不需要过多的了解这个东东,只需要知道它导出的

ThinkPHP3.2.3学习笔记6---专题---数据分页

http://document.thinkphp.cn/manual_3_2.html#data_page thinkphp3.2.3中分类的功能调用的文件$THINKPHP_HOME/ThinkPHP/Library/Think/Page.class.php,这个文件只有150行左右,不复杂,比较容易看懂,方便自己修改,也可以在此基础上进行新功能的扩展. 控制器$THINKPHP_HOME/Application/Home/Controller/PageController.class.php

barabasilab-networkScience学习笔记5- Barab&#225;si-Albert 模型

第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的一个实验室,这里的笔记则是关于里面介绍的课程的笔记,当然别人的课程不是公开课,所以从ppt里只能看到骨干的东西了,对了补充下,slider相关的书籍在这里可以找到 这一节课有事蛮多数学推导,相比较对程序的掌握,感觉自己应该更重视数学一点. 好了不说了,这一节课讲什么呢?讲的BA模型,它解释了无标度性

Python scikit-learn 学习笔记—鸢尾花模型

鸢尾花数据是一个简易有趣的数据集.这个数据集来源于科学家在一岛上找到一种花的三种不同亚类别,分别叫做setosa,versicolor,virginica.但是这三个种类并不是很好分辩,所以他们又从花萼长度,花萼宽度,花瓣长度,花瓣宽度这四个角度测量不同的种类用于定量分析.基于这四个特征,这些数据成了一个多重变量分析的数据集.下面,我们就利用sklearn试着从不同的角度去分析一下这个数据集. 第一种思路是这样:这三种不同的品种每一种想必都会有特点或者存在一定的相似性.我们不妨先把这些杂乱无章的

ThinkPHP学习笔记 实例化模型的四种方法

创建Action类 [php] <?php class NewObjectAction extends Action{ public function index(){ //1.创建一个基础模型 //      //一:实例化一个系统的数据库操作类 //      //new Model('User')相当于M('User'),在Model中放置一个需要操作的表 //      //1命名: //      //  thinkphp默认的有表名前缀,如果为think_user:则在Model中可