一、模型实例化
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

 <?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {
//注意,这里只能用D('User') 不能用 M('User'),因为这里是需要实例化某个具体的模型类User
protected $userObj; public function getUserObj() {
return $this->userObj = D('User');
} //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/getUserInfo
public function getUserInfo() {
$this->userObj = $this->getUserObj(); var_dump($this->userObj->getUserInfo());
echo 'realpath:' . realpath('Controller.class.php');
$included_files = get_included_files();
var_dump($included_files);
echo file_exists('Controller.class.php') ? 'class Controller exists' : 'class Controller not exists';
} //添加数据
//http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/add
public function add() {
$this->userObj = $this->getUserObj(); $ret = $this->userObj->addUser();
echo true ? "ret: $ret, add data succeed": "ret: $ret, add data failed";
} //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/edit/user_id/1
public function edit($user_id = ) {
$this->userObj = $this->getUserObj(); $user_id = intval($user_id);
if ($user_id < ) $user_id = I('user_id', '', 'intval'); //如果在正式的应用中,如果参数值user_id来自用户的输入,且用户输入的数据格式不正确,需要将错误提示信息反馈给用户
if ($user_id < ) return false; $ret = $this->userObj->editUser($user_id);
//var_dump($ret); //bool(true)
echo $ret === true ? "ret: $ret, edit data succeed": "ret: $ret, edit data failed";
} //http://localhost:81/research/thinkphp_3.2.3_full/index.php/Home/User/delete/user_id/16
public function delete($user_id = ) {
$this->userObj = $this->getUserObj(); $user_id = intval($user_id);
if ($user_id < ) $user_id = I('user_id', '', 'intval'); //如果在正式的应用中,如果参数值user_id来自用户的输入,且用户输入的数据格式不正确,需要将错误提示信息反馈给用户
if ($user_id < ) return false; $ret = $this->userObj->deleteUser($user_id);
//var_dump($ret); //bool(true)
echo $ret === true ? "ret: $ret, delete data succeed": "ret: $ret, delete data failed";
}
}
?>

Application/Home/Model/UserModel.class.php

 <?php
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $trueTableName = '99game_user';
protected $userObj; public function getUserObj() {
return $this->userObj = M('User', '99game_');
} //The R of CRUD
public function getUserInfo() {
//在模型层里面,直接通过$this对象即可以直接进行查询, 如果在模型层以外操作数据库,需要首先实例化
$this->userObj = $this->getUserObj(); $rows = $this->userObj->where('level=1')->select();
return $rows;
} //The C of CRUD
//true: 添加数据成功, false: 添加数据失败
public function addUser() {
$this->userObj = $this->getUserObj(); //正常情况下这些数据一般从web界面中输入,这里为了方便测试,随机生成一些数据
$randId = rand(, );
$data['email'] = 'caihf_' . $randId . '@qq.com';
$data['password'] = '123456_' . $randId;
$data['token'] = '123token456_' . $randId; //插入数据的时候, 如果主键是自动增长型,则add方法的返回值是自增型字段的值
$ret = $this->userObj->add($data); //方法_sql用于返回刚才执行的sql语句
echo "sql: " . $this->userObj->_sql() . "\n"; return (int)$ret > ? true : false;
} //The U of CRUD
/**
* 修改用户信息
* @return true: 修改用户信息成功, false: 修改用户信息失败
*/
public function editUser($user_id = ) {
$this->userObj = $this->getUserObj(); $randId = rand(, );
$data['email'] = 'caihf_' . $randId . '@qq.com';
$data['password'] = '123456_' . $randId;
$data['token'] = '123token456_' . $randId; //注意:save方法的返回值是影响的记录数,如果返回false则表示更新出错,因此一定要用恒等来判断是否更新失败。
$ret = $this->userObj->where("user_id=$user_id")->save($data); //方法_sql用于返回刚才执行的sql语句
//比如UPDATE `99game_user` SET `email`='caihf_82482@qq.com',`password`='123456_82482',`token`='123token456_82482' WHERE ( user_id=1 )
//UPDATE `99game_user` SET `email`='caihf_61039@qq.com',`password`='123456_61039',`token`='123token456_61039' WHERE ( user_id=3 )
echo "sql: " . $this->userObj->_sql() . "\n"; return (int)$ret > ? true : false;
} ////The D of CRUD
/**
* 删除用户信息
* @return true: 删除用户信息成功, false: 删除用户信息失败
*/
public function deleteUser($user_id = ) {
$this->userObj = $this->getUserObj(); //注意:delete方法的返回值是删除的记录数,如果返回值是false则表示SQL出错,返回值如果为0表示没有删除任何数据。
$ret = $this->userObj->where("user_id=$user_id")->delete(); //方法_sql用于返回刚才执行的sql语句
//DELETE FROM `99game_user` WHERE ( user_id=16 )
echo "sql: " . $this->userObj->_sql() . "\n"; return (int)$ret > ? true : false;
}
}
?>

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

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

  1. ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理

    ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理 计划时间:第二天下午 背景:数据量大,工程大 目的:自动化,批处理,定制业务流程,不写程序 教程:Pdf/343 数据:chap8/ex5 ...

  2. Django:学习笔记(7)——模型进阶

    Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...

  3. Django:学习笔记(6)——模型

    Django:学习笔记(6)——模型 快速上手 模型到底是什么呢?我们可以想,如果一张数据表的各个字段可以自动映射到一个类的各个属性,则每条记录对应这个类的一个对象.那我们通过类方法来操作对象(即表记 ...

  4. JVM学习笔记——内存模型篇

    JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...

  5. JUC学习笔记——共享模型之管程

    JUC学习笔记--共享模型之管程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的管程部分 我们会分为以下几部分进行介绍: 共享问题 共享问题解决方案 线程安全分析 Monitor ...

  6. JUC学习笔记——共享模型之内存

    JUC学习笔记--共享模型之内存 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的内存部分 我们会分为以下几部分进行介绍: Java内存模型 可见性 模式之两阶段终止 模式之Balk ...

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

    今天本来打算根据自己的计划进行前端自动化的学习的,无奈早上接到一个任务需求需要新增一个页面.自从因为工作需要转前端之后,自己的主要注意力几 乎都放在JavaScript上面了,对CSS和HTML这方面 ...

  8. JVM学习笔记-JVM模型

    JVM学习笔记 == 标签(空格分隔): jvm 学习笔记全部来自于<深入理解java虚拟机>总结 jvm内存示意图 虚拟机栈(Java Virtual Machine Stacks): ...

  9. ThinkPHP3.2.3学习笔记5---模板(一)

    一.模板简介 此文中的学习笔记部分资料是来自于thinkphp官方文档,http://document.thinkphp.cn/manual_3_2.html#template 本章的内容主要讲述了如 ...

  10. barabasilab-networkScience学习笔记5- Barabási-Albert 模型

    第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...

随机推荐

  1. 简述WEB项目前端脚本的一次重构历程,labJs,requireJs实践[转载]

    重构前的状态:    大量的js代码混在繁多的Jsp文件中,对第三方的js库依赖也很杂乱.虽然在部分交互性较强的页面中,将js代码分离到了独立的js文件中,但是代码结构及依赖管理依然很乱.不说新人来了 ...

  2. 创建SSH keys

    1.检查是否已经有SSH Key存在 windows: type "%userprofile%\.ssh\id_rsa.pub" Linux: cat ~/.ssh/id_rsa. ...

  3. powerDigner使用

    PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...

  4. jq自定义裁剪,代码超级简单,易修改

    1.自定义宽高效果 1.html 代码  index.html <!DOCTYPE html> <html lang="en"> <head> ...

  5. CEF3研究(四)之javascript集成

    一.介绍 谷歌浏览器和CEF使用V8JavaScript Engine作为内容的JavaScript实现.在浏览器中的每个窗口都有它自己在的JS上下文提供作用域和在窗口中安全的执行JS代码.CEF暴露 ...

  6. Highcharts:X轴分组堆叠图

    在设计一个项目中的数据展示页面时.想要设计双X轴,一个轴显示须要的项.一个轴对这些项进行分组.效果如图: Highcharts自带双X轴展示方式.可是效果不是太理想.调整起来也会麻烦些 看到Highc ...

  7. axis client tomcat jsp调用最少jar

    tomcat调用和main方法调用不同在于引入的jar不一样.tomcat引入的jar是全部lib以下的jar包,main是project引入的jar.假设直接进行公布lib下的全部jar都会引入到p ...

  8. 【.NET Core项目实战-统一认证平台】基于jackcao博客使用VSCode开发及感悟One搭建开发环境

    原博客系列文章链接:https://www.cnblogs.com/jackcao/ 金焰的世界 感谢博主无私的奉献,感谢博主幼儿班的教学 基于jackcao博客使用VsCode开发及感悟One搭建开 ...

  9. Sublime Text 3.3143最新注册码

    Sublime Text3之前用的是老版本,昨天手贱点了更新,就要重新激活,网上找了好多都是之前版本的,以下给干货 —– BEGIN LICENSE —– TwitterInc User Licens ...

  10. Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境)

    Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境) 转载请注明:IT_xiao小巫 本篇博客介绍Cocos2d-x 3.2给我们提供的一个样例.获取当前程 ...