zoukankan      html  css  js  c++  java
  • ThinkPHP中实例化对象M()和D()的区别,select和find的区别 【转】

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

    在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。
    通俗一点说:
    M实例化参数是数据库的表名。
    D实例化的是你自己在Model文件夹下面建立的模型文件

    例如:$user = new UserModel();
    等价于$user = D('user');
    如果实例化的是一个空模型
    例如 $Demo = new Model();
    那么它等价于 $Demo = M();


    D和M的区别主要在于:
    M方法不需要创建模型类文件,M方法不会读取模型类,所以默认情况下自动验证是无效的,但是可以通过动态赋值的方式实现
    而D方法必须有创建模型类。

    我们可以用下面两种方法去创建一个数据表的映射对象
    第一种:$Test = D('Test')
    第二种:$Test = new Model('Test')
    虽然这两种都可以对数据进行select,insert,delete,udpate操作,在
    数据验证上有很大的不同,用第一种方式实例一个模型就会有数据检查功能,如果 title 没有填写的话就会提示 “请输入标题” (这个是tp提供的一个自动验证功能,当然也需要在相应的model中定义好验证条件);

    如果用第二种就没有了·····

    还有1个区别就是当用了$trueTableName后,必须用$test=d('test'),表示查询的是test表,

    如果用的是$test=m('test'),那么都表示查询的数据边是think_test。

    thinkphp2.0版本测试有如此上面的问题,D就是实例化一个基于Model文件的Model。M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在。

    下面列举常见的字母方法:
    ============================================================================
    A快速实例化Action类库
    B执行行为类
    C配置参数存取方法
    D快速实例化Model类库
    F快速简单文本数据存取方法
    L 语言参数存取方法
    M快速高性能实例化模型
    R快速远程调用Action类方法
    S快速缓存存取方法
    U URL动态生成和重定向方法
    W 快速Widget输出方法
     
    D函数实例化的是你当前项目的Lib/Model下面的模块。
    如果该模块不存在的话,直接返回实例化Model的对象(意义就与M()函数相同)。
    而M只返回,实例化Model的对象。它的$name参数作为数据库的表名来处理对数据库的操作。

    2.thinkphp的select和find的区别

    thinkphp是比较好的php开发框架,能比较快速的开发MVC架构的管理系统,我们需要用到 select()和find()方法,两个方法都能返回数据集数组,但有什么不同呢?先看一下我的代码对比:

    $tech=M('techlevel','HR_CS_','DB_CONFIG2'); 
    $Data=$tech->where('id=1')->find(); 
    dump($Data); 
    $Data=$tech->where('id=1')->select(); 
    dump($Data);

    结果如下:

    复制代码
    array(6) { 
      ["ID"] => int(1) 
      ["TechLevel"] => string(2) "10"
      ["Remark"] => string(4) "??"
      ["CreateDate"] => string(19) "2013-03-14 15:14:38"
      ["CreateBy"] => string(5) "admin"
      ["ROW_NUMBER"] => string(1) "1"
    } 
        
    array(1) { 
      [0] => array(6) { 
        ["ID"] => int(1) 
        ["TechLevel"] => string(2) "10"
        ["Remark"] => string(4) "??"
        ["CreateDate"] => string(19) "2013-03-14 15:14:38"
        ["CreateBy"] => string(5) "admin"
        ["ROW_NUMBER"] => string(1) "1"
      } 
    }
    复制代码

    从上面的代码可以看出,find()返回一个一维数组,select()返回一个二维数组,所以在取值时有所不同,

    一维数组取值用 $data["TechLevel"],

    二维数组取值用 $data[0]["TechLevel"],

    两者还有一个重要的不同之处:读取数据的操作其实和数据集的类似,select可用的所有连贯操作方法也都可以用于find方法,区别在于find方法最多只会返回一条记录,因此limit方法对于find查询操作是无效的。由于一开始没了解这个用法,调试一天也取不值,最后有dump方法才看到两个方法的不同所在!

  • 相关阅读:
    Top 10 Product Manager Skills To Boost Your Resume In 2021
    大数据知识梳理
    B端产品如何设计权限系统?
    华三盒式交换机MAC、ARP、Route性能表项参数查询
    中了传说中的挖矿病毒
    SqlServer 2019 事务日志传送
    docker中生成的pdf中文是方框的解决方案
    The Live Editor is unable to run in the current system configuration
    2021 面试题大纲
    五分钟搞定Docker安装ElasticSearch
  • 原文地址:https://www.cnblogs.com/tingfengqieyu/p/5040766.html
Copyright © 2011-2022 走看看