thinkphp 模型实例化
在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。
根据不同的模型定义,我们有几种实例化模型的方法,根据需要采用不同的方式:
直接实例化
可以和实例化其他类库一样实例化模型类,例如:
$User = new \Home\Model\UserModel();$Info = new \Admin\Model\InfoModel();// 带参数实例化$New = new \Home\Model\NewModel('blog','think_',$connection);
模型类通常都是继承系统的\Think\Model类,该类的架构方法有三个参数,分别是:
Model(['模型名'],['数据表前缀'],['数据库连接信息']);
三个参数都是可选的,大多数情况下,我们根本无需传入任何参数即可实例化。
| 参数 | 描述 |
|---|---|
| 模型名 | 模型的名称 和数据表前缀一起配合用于自动识别数据表名称 |
| 数据表前缀 | 当前数据表前缀 和模型名一起配合用于自动识别数据表名称 |
| 数据库连接信息 | 当前数据表的数据库连接信息 如果没有则获取配置文件中的 |
数据表前缀传入空字符串表示取当前配置的表前缀,如果当前数据表没有前缀,则传入null即可。
数据库连接信息参数支持三种格式:
1、字符串定义
字符串定义采用DSN格式定义,格式定义规范为:
type://username:passwd@hostname:port/DbName// 3.2.1以上版本还可以支持字符集设定type://username:passwd@hostname:port/DbName#charset
例如:
new \Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/demo');
2、数组定义
可以传入数组格式的数据库连接信息,例如:
$connection = array('db_type' => 'mysql','db_host' => '127.0.0.1','db_user' => 'root','db_pwd' => '12345','db_port' => 3306,'db_name' => 'demo',);new \Home\Model\NewModel('new','think_',$connection);
3.2.1以上版本还可以支持数据编码设定,例如:
$connection = array('db_type' => 'mysql','db_host' => '127.0.0.1','db_user' => 'root','db_pwd' => '12345','db_port' => 3306,'db_name' => 'demo','db_charset' => 'utf8',);new \Home\Model\NewModel('new','think_',$connection);
3.2.3开始还可以支持数据的部署模式和调试模式设定,例如:
$connection = array('db_type' => 'mysql','db_host' => '192.168.1.2,192.168.1.3','db_user' => 'root','db_pwd' => '12345','db_port' => 3306,'db_name' => 'demo','db_charset' => 'utf8','db_deploy_type'=> 1,'db_rw_separate'=> true,'db_debug' => true,);// 分布式数据库部署 并且采用读写分离 开启数据库调试模式new \Home\Model\NewModel('new','think_',$connection);
注意,如果设置了db_debug参数,那么数据库调试模式就不再受APP_DEBUG常量影响。
3、配置定义
我们可以事先在配置文件中定义好数据库连接信息,然后在实例化的时候直接传入配置的名称即可,例如:
//数据库配置1'DB_CONFIG1' => array('db_type' => 'mysql','db_user' => 'root','db_pwd' => '1234','db_host' => 'localhost','db_port' => '3306','db_name' => 'thinkphp'),//数据库配置2'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp',
在配置文件中定义数据库连接信息的时候也支持字符串和数组格式,格式和上面实例化传入的参数一样。
然后,我们就可以这样实例化模型类传入连接信息:
new \Home\Model\NewModel('new','think_','DB_CONFIG1');new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');
事实上,当我们实例化的时候没有传入任何的数据库连接信息的时候,系统其实默认会获取配置文件中的相关配置参数,包括:
'DB_TYPE' => '', // 数据库类型'DB_HOST' => '', // 服务器地址'DB_NAME' => '', // 数据库名'DB_USER' => '', // 用户名'DB_PWD' => '', // 密码'DB_PORT' => '', // 端口'DB_PREFIX' => '', // 数据库表前缀'DB_DSN' => '', // 数据库连接DSN 用于PDO方式'DB_CHARSET' => 'utf8', // 数据库的编码 默认为utf8
如果应用配置文件中有配置上述数据库连接信息的话,实例化模型将会变得非常简单。
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基类,同时对于已实例化过的模型,不会重复去实例化。
D方法还可以支持跨模块调用,需要使用://实例化Admin模块的User模型D('Admin/User');//实例化Extend扩展命名空间下的Info模型D('Extend://Editor/Info');
注意:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类。
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方法实例化的时候是会直接忽略。
实例化空模型类
如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
//实例化空模型$Model = new Model();//或者使用M快捷方法是等效的$Model = M();//进行原生的SQL查询$Model->query('SELECT * FROM think_user WHERE status = 1');
实例化空模型类后还可以用table方法切换到具体的数据表进行操作
我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。
thinkphp 模型实例化的更多相关文章
- thinkphp模型实例化
方法一 方法二
- thinkphp 连接数据库 & 实例化模型操作 (下接thinkphp CURD 操作)/慕课
7.1 连接数据库 (06:15) 1 7.2实例化模型 1 1.实例化基础模型 2 2. 实例化用户自定义模型 2 问题 2 3. 实例化公共模型 4 4. 实例化空模型 7 7.1 连接数据 ...
- [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别
1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...
- 错误之thinkphp模型使用发生的错误
刚接触thinkphp模型的创建,在创建model类时在这里边声明了类的对象.唉,这是不理解的错误啊.什么叫做实例化模型对象,在控制器里边使用才创建. 模型这里写各种用到的函数. 这里我也体会到了查询 ...
- thinkphp模型层Model、Logic、Service讲解
thinkphp模型层Model.Logic.Service讲解 时间:2014-08-24 15:54:56 编辑:一切随缘 文章来源:php教程网 已阅读:771 次 js特效 ...
- ThinkPHP中实例化对象M()和D()的区别,select和find的区别
原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在 ...
- ThinkPHP中实例化对象M()和D()的区别
ThinkPHP中实例化对象M()和D()的区别 ThinkPHP中实例化对象M()和D()的区别?ThinkPHP如何实例化对象?在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法 ...
- ThinkPHP 模型(Model)命名规范
一个小问题搞了好久:如果数据库的表名中有下划线,那么在用thinkphp做自动完成时注意Model类的命名要变成驼峰法,文件名和类名都要变.( 另外注意:只有使用create方法创建数据时才能调用到自 ...
- PHP.23-ThinkPHP框架的三种模型实例化-(D()方法与M()方法的区别)
三种模型实例化 原则上:每个数据表应对应一个模型类(Home/Model/GoodsModel.class.php --> 表tp_goods) 1.直接实例化 和实例化其他类库一样实例化模型类 ...
随机推荐
- 安装Storm的基本过程
- PHP算法之有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认为是 ...
- 解决vi显示文件不能全屏的问题
https://blog.csdn.net/ly890700/article/details/52735092 docker外: vi ~/.vimrc
- react 使用react-router-dom 在Route对象上component 参数接收的是一个方法而非一个对象
其实对于jsx语法 一直觉的它有点清晰都不是很好,js和html混在一起有点不伦不类的样子,以下是我在使用react中遇到的一个很奇葩的事情 假定你定义了一个component Mine import ...
- Eclipse规范注释及注释文档的生成
Eclipse作为JavaIDE(Integrated Development Environment,集成开发环境),可以通过设置自动添加Javadoc注释信息,如@author 作者名.@vers ...
- curl 命令帮助及使用
目录 一.简介 二.curl 帮助文档 三.curl 的使用 前言 刚接触 curl 就发现它的非常强大.奈何帮助文档全是英文,看起来贼费劲.无奈只能硬着头皮用自己蹩脚的英语和翻译软件硬生生的翻译了一 ...
- 帝国cms简介显示转义字符问题
在模板中设置简介截取字数为0,前端显示用css控制即可 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 也可以 1,在后 ...
- Delphi Xml
用递归方法,使用 xml 文档生成 Treeview 树形视图.由于是动态生成,所以可以通过修改 xml 的逻辑来定制 Treeview 的结构,从而实现了 xml 对 Treeview 的动态配置, ...
- javascript html jquery 入门
就开发难易程度来说,现在普遍使用jquery,本人学习jquery html css时间不长,以前写过Flex. CSS+JS+HTML组成HTML开发三驾马车.学习js开发我认为怎么入门十分重要.根 ...
- maven-version
<java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.bu ...