在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。

根据不同的模型定义,我们有几种实例化模型的方法,根据需要采用不同的方式:

直接实例化

可以和实例化其他类库一样实例化模型类,例如:

  1. $User = new \Home\Model\UserModel();
  2. $Info = new \Admin\Model\InfoModel();
  3. // 带参数实例化
  4. $New = new \Home\Model\NewModel('blog','think_',$connection);

模型类通常都是继承系统的\Think\Model类,该类的架构方法有三个参数,分别是:

Model(['模型名'],['数据表前缀'],['数据库连接信息']);

三个参数都是可选的,大多数情况下,我们根本无需传入任何参数即可实例化。

参数 描述
模型名 模型的名称 和数据表前缀一起配合用于自动识别数据表名称
数据表前缀 当前数据表前缀 和模型名一起配合用于自动识别数据表名称
数据库连接信息 当前数据表的数据库连接信息 如果没有则获取配置文件中的

数据表前缀传入空字符串表示取当前配置的表前缀,如果当前数据表没有前缀,则传入null即可。

数据库连接信息参数支持三种格式:

1、字符串定义

字符串定义采用DSN格式定义,格式定义规范为:

  1. type://username:passwd@hostname:port/DbName
  2. // 3.2.1以上版本还可以支持字符集设定
  3. type://username:passwd@hostname:port/DbName#charset

例如:

  1. new \Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/demo');
2、数组定义

可以传入数组格式的数据库连接信息,例如:

  1. $connection = array(
  2. 'db_type' => 'mysql',
  3. 'db_host' => '127.0.0.1',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '12345',
  6. 'db_port' => 3306,
  7. 'db_name' => 'demo',
  8. );
  9. new \Home\Model\NewModel('new','think_',$connection);

3.2.1以上版本还可以支持数据编码设定,例如:

  1. $connection = array(
  2. 'db_type' => 'mysql',
  3. 'db_host' => '127.0.0.1',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '12345',
  6. 'db_port' => 3306,
  7. 'db_name' => 'demo',
  8. 'db_charset' => 'utf8',
  9. );
  10. new \Home\Model\NewModel('new','think_',$connection);

3.2.3开始还可以支持数据的部署模式和调试模式设定,例如:

  1. $connection = array(
  2. 'db_type' => 'mysql',
  3. 'db_host' => '192.168.1.2,192.168.1.3',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '12345',
  6. 'db_port' => 3306,
  7. 'db_name' => 'demo',
  8. 'db_charset' => 'utf8',
  9. 'db_deploy_type'=> 1,
  10. 'db_rw_separate'=> true,
  11. 'db_debug' => true,
  12. );
  13. // 分布式数据库部署 并且采用读写分离 开启数据库调试模式
  14. new \Home\Model\NewModel('new','think_',$connection);

注意,如果设置了db_debug参数,那么数据库调试模式就不再受APP_DEBUG常量影响。

3、配置定义

我们可以事先在配置文件中定义好数据库连接信息,然后在实例化的时候直接传入配置的名称即可,例如:

  1. //数据库配置1
  2. 'DB_CONFIG1' => array(
  3. 'db_type' => 'mysql',
  4. 'db_user' => 'root',
  5. 'db_pwd' => '1234',
  6. 'db_host' => 'localhost',
  7. 'db_port' => '3306',
  8. 'db_name' => 'thinkphp'
  9. ),
  10. //数据库配置2
  11. 'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp',

在配置文件中定义数据库连接信息的时候也支持字符串和数组格式,格式和上面实例化传入的参数一样。

然后,我们就可以这样实例化模型类传入连接信息:

  1. new \Home\Model\NewModel('new','think_','DB_CONFIG1');
  2. new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');

事实上,当我们实例化的时候没有传入任何的数据库连接信息的时候,系统其实默认会获取配置文件中的相关配置参数,包括:

  1. 'DB_TYPE' => '', // 数据库类型
  2. 'DB_HOST' => '', // 服务器地址
  3. 'DB_NAME' => '', // 数据库名
  4. 'DB_USER' => '', // 用户名
  5. 'DB_PWD' => '', // 密码
  6. 'DB_PORT' => '', // 端口
  7. 'DB_PREFIX' => '', // 数据库表前缀
  8. 'DB_DSN' => '', // 数据库连接DSN 用于PDO方式
  9. 'DB_CHARSET' => 'utf8', // 数据库的编码 默认为utf8

如果应用配置文件中有配置上述数据库连接信息的话,实例化模型将会变得非常简单。

D方法实例化

上面实例化的时候我们需要传入完整的类名,系统提供了一个快捷方法D用于数据模型的实例化操作。

要实例化自定义模型类,可以使用下面的方式:

  1. <?php
  2. //实例化模型
  3. $User = D('User');
  4. // 相当于 $User = new \Home\Model\UserModel();
  5. // 执行具体的数据操作
  6. $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基类,同时对于已实例化过的模型,不会重复去实例化。

  1. D方法还可以支持跨模块调用,需要使用:
  2. //实例化Admin模块的User模型
  3. D('Admin/User');
  4. //实例化Extend扩展命名空间下的Info模型
  5. D('Extend://Editor/Info');

注意:跨模块实例化模型类的时候 不支持自动加载公共模块的模型类。

广东大理石平台

M方法实例化模型

D方法实例化模型类的时候通常是实例化某个具体的模型类,如果你仅仅是对数据表进行基本的CURD操作的话,使用M方法实例化的话,由于不需要加载具体的模型类,所以性能会更高。

例如:

  1. // 使用M方法实例化
  2. $User = M('User');
  3. // 和用法 $User = new \Think\Model('User'); 等效
  4. // 执行其他的数据操作
  5. $User->select();

M方法也可以支持跨库操作,例如:

  1. // 使用M方法实例化 操作db_name数据库的ot_user表
  2. $User = M('db_name.User','ot_');
  3. // 执行其他的数据操作
  4. $User->select();

M方法的参数和\Think\Model类的参数是一样的,也就是说,我们也可以这样实例化:

  1. $New = M('new','think_',$connection);
  2. // 等效于 $New = new \Think\Model('new','think_',$connection);

具体的参数含义可以参考前面的介绍。

M方法实例化的时候,默认情况下是直接实例化系统的\Think\Model类,如果我们希望实例化其他的公共模型类的话,可以使用如下方法:

  1. $User = M('\Home\Model\CommonModel:User','think_','db_config');
  2. // 相当于 $User = new \Home\Model\CommonModel('User','think_','db_config');

如果你的模型类有自己的业务逻辑,M方法是无法支持的,就算是你已经定义了具体的模型类,M方法实例化的时候是会直接忽略。

实例化空模型类

如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:

  1. //实例化空模型
  2. $Model = new Model();
  3. //或者使用M快捷方法是等效的
  4. $Model = M();
  5. //进行原生的SQL查询
  6. $Model->query('SELECT * FROM think_user WHERE status = 1');

实例化空模型类后还可以用table方法切换到具体的数据表进行操作

我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。

thinkphp 模型实例化的更多相关文章

  1. thinkphp模型实例化

    方法一 方法二

  2. thinkphp 连接数据库 & 实例化模型操作 (下接thinkphp CURD 操作)/慕课

    7.1 连接数据库 (06:15) 1 7.2实例化模型 1 1.实例化基础模型 2 2. 实例化用户自定义模型 2 问题 2 3. 实例化公共模型 4 4. 实例化空模型 7    7.1 连接数据 ...

  3. [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...

  4. 错误之thinkphp模型使用发生的错误

    刚接触thinkphp模型的创建,在创建model类时在这里边声明了类的对象.唉,这是不理解的错误啊.什么叫做实例化模型对象,在控制器里边使用才创建. 模型这里写各种用到的函数. 这里我也体会到了查询 ...

  5. thinkphp模型层Model、Logic、Service讲解

    thinkphp模型层Model.Logic.Service讲解 时间:2014-08-24 15:54:56   编辑:一切随缘   文章来源:php教程网 已阅读:771 次       js特效 ...

  6. ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在 ...

  7. ThinkPHP中实例化对象M()和D()的区别

    ThinkPHP中实例化对象M()和D()的区别 ThinkPHP中实例化对象M()和D()的区别?ThinkPHP如何实例化对象?在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法 ...

  8. ThinkPHP 模型(Model)命名规范

    一个小问题搞了好久:如果数据库的表名中有下划线,那么在用thinkphp做自动完成时注意Model类的命名要变成驼峰法,文件名和类名都要变.( 另外注意:只有使用create方法创建数据时才能调用到自 ...

  9. PHP.23-ThinkPHP框架的三种模型实例化-(D()方法与M()方法的区别)

    三种模型实例化 原则上:每个数据表应对应一个模型类(Home/Model/GoodsModel.class.php --> 表tp_goods) 1.直接实例化 和实例化其他类库一样实例化模型类 ...

随机推荐

  1. 微信小程序支付之代码详解

    微信小程序自带的一套规则,类似vue语法,但是好多功能都集成在api中,给了很多初学者轮子,所以首先要熟悉这些api,忘记可照官网继续开发 这里主要说下微信小程序的支付,原理类似上篇介绍的公众网页支付 ...

  2. sqlmap 使用方法及实例

    注:标黄处为输入内容     批注为得到的信息 1.-u url --dbs 爆数据库 [root@Hacker~]# Sqlmap -u http://www.lbgold.com/article_ ...

  3. vue生态系统之vue-router

    一.vue-router安装与使用 1.安装 进入项目目录中安装vue-router模块 E:\vueProject\webpackProject>cnpm install vue-router ...

  4. 每天进步一点点-深度学习入门-基于Python的理论与实现 (2)

    今天要补上两天的 不补了,新手,看的比较慢-- 手写识别例子跳过先 思考如何实现数字5的识别 三种方法: 训练数据:学习,寻找最优解 测试数据:评价模型能力. 损失函数:以损失函数为线索寻找自由权重参 ...

  5. Linux 系统分区与目录介绍

    分区 分区类型 主分区:总共最多只能分四个 扩展分区: 只能有一个,也算作主分区的一种,也就是说主分区加扩展分区最多有四个. 但是扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用. 逻辑分区 ...

  6. sublime的安装与使用

    1.sublime简介 Sublime是一个代码编辑器,可以编写HTML,php,js,css等文件. Sublime是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具 ...

  7. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

    $*********************************************************************************************$ 博主推荐 ...

  8. Vue实现一个学生信息录入系统,实现录入和删除

    效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  9. NOIp2018集训test-9-1(am)

    1.最大值 可以用FWT水过去,李巨写了FWT结果中途爆int了炸了几十分好像. 我乱搞了一下把除了大数据有or的搞出来然后90,还是蛮划算的.我yy的做法: 1.xor 字典树上贪心, 一开始我打了 ...

  10. 禁用NX软件启动欢迎界面[转载]

    环境变量UGII_BACKGROUND_URL  NONE 转载自https://www.ugnx.net/wt/414