zoukankan      html  css  js  c++  java
  • thinkphp 模型实例化

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

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

    直接实例化

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

    1. $User = new HomeModelUserModel();
    2. $Info = new AdminModelInfoModel();
    3. // 带参数实例化
    4. $New = new HomeModelNewModel('blog','think_',$connection);

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

    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 HomeModelNewModel('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 HomeModelNewModel('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 HomeModelNewModel('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 HomeModelNewModel('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 HomeModelNewModel('new','think_','DB_CONFIG1');
    2. new HomeModelBlogModel('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 HomeModelUserModel();
    5. // 执行具体的数据操作
    6. $User->select();

    当 HomeModelUserModel 类不存在的时候,D函数会尝试实例化公共模块下面的 CommonModelUserModel 类。

    D方法的参数就是模型的名称,并且和模型类的大小写定义是一致的,例如:

    参数实例化的模型文件(假设当前模块为Home)
    User 对应的模型类文件的 HomeModelUserModel.class.php
    UserType 对应的模型类文件的 HomeModelUserTypeModel.class.php

    如果在Linux环境下面,一定要注意D方法实例化的时候的模型名称的大小写。

    D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化系统的ThinkModel基类,同时对于已实例化过的模型,不会重复去实例化。

    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 ThinkModel('User'); 等效
    4. // 执行其他的数据操作
    5. $User->select();

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

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

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

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

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

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

    1. $User = M('HomeModelCommonModel:User','think_','db_config');
    2. // 相当于 $User = new HomeModelCommonModel('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方法。

  • 相关阅读:
    SCI写作经典替换词,瞬间高大上!(转)
    最佳化常用测试函数 Optimization Test functions
    算法复杂度速查表
    VS 代码行统计
    CPLEX IDE 菜单栏语言设置( 中文 英文 韩文 等多国语言 设置)
    如何从PDF文件中提取矢量图
    Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
    visual studio 资源视图 空白 解决方案
    MFC DialogBar 按钮灰色不响应
    嗨翻C语言笔记(二)
  • 原文地址:https://www.cnblogs.com/furuihua/p/11792248.html
Copyright © 2011-2022 走看看