ThinkPHP之M方法实例详解


Posted in PHP onJune 20, 2014

M方法用于实例化一个基础模型类,和D方法的区别在于:

1、不需要自定义模型类,减少IO加载,性能较好;
2、实例化后只能调用基础模型类(默认是Model类)中的方法;
3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息;
D方法的强大则体现在你封装的自定义模型类有多强,不过随着新版ThinkPHP框架的基础模型类的功能越来越强大,M方法也比D方法越来越实用了。

M方法的调用格式:

M('[基础模型名:]模型名','数据表前缀','数据库连接信息')

我们来看下M方法具体有哪些用法:

1、实例化基础模型(Model) 类

在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作:

//实例化User模型
$User = M('User');
 //执行其他的数据操作
$User->select();

这种方法最简单高效,因为不需要定义任何的模型类,所以支持跨项目调用。缺点也是因为没有自定义的模型类,因此无法写入相关的业务逻辑,只能完成基本的CURD操作。

$User = M('User');

其实等效于:

$User = new Model('User');

表示操作think_user表。M方法和D方法一样也有单例功能,多次调用并不会重复实例化。M方法的模型名参数在转换成数据表的时候会自动转换成小写,也就是说ThinkPHP的数据表命名规范是全小写的格式。

2、实例化其他公共模型类

第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。

$User = M('CommonModel:User');

改用法其实等效于:

$User = new CommonModel('User');

因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。

3、传入表前缀、数据库和其他信息

M方法有三个参数,第一个参数是模型名称(可以包括基础模型类和数据库),第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:

$User = M('db2.User','think_');

表示实例化Model模型类,并操作db2数据库中的think_user表。
如果第二个参数留空或者不传,表示使用当前项目配置中的数据表前缀,如果操作的数据表没有表前缀,那么可以使用:

$User = M('db1.User',null);

表示实例化Model模型类,并操作db1数据库中的user表。
如果你操作的数据库需要不同的用户账号,可以传入数据库的连接信息,例如:

$User = M('User','think_','mysql://user_a:1234@localhost:3306/thinkphp');

表示基础模型类用Model,然后对think_user表进行操作,用user_a账号进行数据库连接,操作数据库是thinkphp。
第三个连接信息参数可以使用DSN配置或者数组配置,甚至可以支持配置参数。
例如,在项目配置文件中配置了:

'DB_CONFIG'=>'mysql://user_a:1234@localhost:3306/thinkphp';

则可以使用:

$User = M('User','think_','DB_CONFIG');

基础模型类和数据库可以一起使用,例如:

$User = M('CommonModel:db2.User','think_');

如果要实例化分层模型的话,利用公共模型类的方式,我们可以使用:

M('UserLogic:User');

来实例化UserLogic,虽然这样做的意义不大,因为可以用

D('User','Logic');

实现同样的功能。

PHP 相关文章推荐
php 模拟POST|GET操作实现代码
Jul 20 PHP
apache+php+mysql安装配置方法小结
Aug 01 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
PHP 获取文件路径(灵活应用__FILE__)
Feb 15 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
php实现的一段简单概率相关代码
May 30 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
PHP面向对象学习之parent::关键字
Jan 18 PHP
php实现微信模板消息推送
Mar 30 PHP
PHP中的empty、isset、isnull的区别与使用实例
Mar 22 PHP
php实现的短网址算法分享
Jun 20 #PHP
ThinkPHP3.1之D方法实例详解
Jun 20 #PHP
php写的AES加密解密类分享
Jun 20 #PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 #PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 #PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 #PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 #PHP
You might like
BBS(php & mysql)完整版(二)
2006/10/09 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
Python中实现switch功能实例解析
2018/01/11 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
浅谈Python中的bs4基础
2018/10/21 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
学习和使用python的13个理由
2019/07/30 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
CSS3 边框效果
2019/11/04 HTML / CSS
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
大学生实习思想汇报
2014/01/12 职场文书
无传销社区工作方案
2014/05/13 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书