使用M方法
如果是如下情况,请考虑使用 M方法:
1.对数据表进行简单的 CURD 操作而无复杂的业务逻辑时
2.只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用
M方法 甚至可以简单看着就是对参数表名对应的数据表的操作:
$User = M('User');使用D方法
如果是如下情况,请考虑使用 D方法:
1.需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等2.业务逻辑比较复杂,且涉及的表众多
3.将业务逻辑定义在了自定义的模型类里面(Lib/Model目录下),而想在操作中实现这些业务逻辑
另外 D方法 不支持跨项目调用,需要使用:
$User = D('User', 'Admin'); // 实例化 Admin 项目下面的 User 模型
$User = D('Admin.User'); // 启用了项目分组
提示:
启用了项目分组后,Model 类并不必然对应着项目分组。多个项目组之间共有的模型类,统一放在 Model 目录下,可以直接使用D('ModelName') 实例化。而 D('User.UserInfo') 并不表示 User 一定是一个项目分组,也可以仅仅是对 Model 下文件的一个分类目录,D('User.UserInfo') 实例化的是 User 目录下的 UserInfo 模型类。
总结
M方法 和 D方法 都可以在模型类文件不存在的情况下直接使用的,但显然 M方法 更高效;但要使用模型类里面业务逻辑,就必须使用 D方法。
一个比较形象的比喻就是:M方法 就如一台刚装好操作系统的电脑,只能使用一些基本功能;而 D方法 就如在装好的系统上再安装了一些如 Office、QQ 等应用软件,功能更加强大,同时整个电脑运行速度也变慢了。
以上是对 M方法和D方法区别的一些总结,M方法 和 D方法 要根据实际情况来具体选择。
M方法
M方法用于实例化一个基础模型类,和D方法的区别在于:
1、不需要自定义模型类,减少IO加载,性能较好;
2、实例化后只能调用基础模型类(默认是Model类)中的方法;
3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息;
D方法的强大则体现在你封装的自定义模型类有多强,不过随着新版ThinkPHP框架的基础模型类的功能越来越强大,M方法也比D方法越来越实用了。
M方法的调用格式:
M('[基础模型名:]模型名','数据表前缀','数据库连接信息')
我们来看下M方法具体有哪些用法:
1、实例化基础模型(Model) 类
在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作:
-
//实例化User模型
-
$User = M('User');
-
//执行其他的数据操作
-
$User->select();
复制代码
- $User = M('User');
- $User = new Model('User');
2、实例化其他公共模型类
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。
-
$User = M('CommonModel:User');
复制代码
- $User = new CommonModel('User');
3、传入表前缀、数据库和其他信息
M方法有三个参数,第一个参数是模型名称(可以包括基础模型类和数据库),第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:
-
$User = M('db2.User','think_');
复制代码
如果第二个参数留空或者不传,表示使用当前项目配置中的数据表前缀,如果操作的数据表没有表前缀,那么可以使用:
- $User = M('db1.User',null);
如果你操作的数据库需要不同的用户账号,可以传入数据库的连接信息,例如:
- $User = M('User','think_','mysql://user_a:1234@localhost:3306/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');
- D('User','Logic');
D方法
D方法应该是用的比较多的方法了,用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:
D('[项目://][分组/]模型','模型层名称')
方法的返回值是实例化的模型对象。
D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化Model基类,同时对于已实例化过的模型,不会重复去实例化。
D方法最常用的用法就是实例化当前项目的某个自定义模型,例如:
- // 实例化User模型
- $User = D('User');
- import('@.Model.UserModel');
- $User = new UserModel();
- new Model('User');
D方法可以支持跨分组和项目实例化模型,例如:
- //实例化Admin项目的User模型
- D('Admin://User')
- //实例化Admin分组的User模型
- D('Admin/User')
3.1版本开始,由于增加了分层模型的支持,所以D方法也可以实例化其他的模型,例如:
-
// 实例化UserService类
-
$User = D('User','Service');
-
// 实例化UserLogic类
-
$User = D('User','Logic');
复制代码
- D('User','Service');
- import('@.Service.UserService');
- $User = new UserSerivce();