ThinkPHP--模型初步

Posted 付俊捷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP--模型初步相关的知识,希望对你有一定的参考价值。

  学习要点:

  1.创建数据库

  2.实例化模型

  3.字段定义

  本节课,我们重点了解一下 Thinkphp 模型操作部分。模型是 MVC 中的 M,可以理解为操作数据库部分操作。

  一.创建数据库

  在使用模型操作之前,我们首先创建一个数据库:thinkphp。创建一个用户表:user。

  添加一些数据即可。

  ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来。我们只需要使用公共的 Db 类进行操作,无须针对不同的数据库写不同的代码和底层实现。Db 类会自动调用相应的数据库驱动来处理。

  目前支持的数据库包括 mysql(包含 mysql 和 mysqli)、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo、PDO 等。

 DB_TYPE 设置  支持的数据库类型
mysql 或 mysqli  mysql
 pgsql  pgsql
 sqlite  sqlite
 mssql  sqlserver
 oracle  oracle
 ibase  ibase
 mongo  mongo
 PDO  PDO 支持的所有数据库

  //全局配置定义

  \'DB_TYPE\'=>\'mysql\',               //数据库类型

  \'DB_HOST\'=>\'localhost\',    //服务器地址

  \'DB_NAME\'=>\'thinkphp\',   //数据库名

  \'DB_USER\'=>\'root\',           //用户名

  \'DB_PWD\'=>\'123456\',     //密码

  \'DB_PORT\'=>3306,          //端口

  \'DB_PREFIX\'=>\'think_\',    //数据库表前缀

  PS:数据库全局配置信息除了 PDO,均可以采用上面的设置。

  //PDO专用定义

  \'DB_TYPE\'=>\'pdo\', //数据库类型

  \'DB_USER\'=>\'root\', //用户名

  \'DB_PWD\'=>\'123456\', //密码

  \'DB_PREFIX\'=>\'think_\', //数据库表前缀

  \'DB_DSN\'=>\'mysql:host=localhost;dbname=thinkphp;charset=UTF8\',

 

  二.实例化模型

  连接上数据库后,我们需要从数据库里操作数据,那么就需要实例化模型类。在 ThinkPHP 中,提供了 Model 基类处理,也可以使用 M()方法。

 

  //实例化Model类,传一个数据表名

  $user = new Model(\'User\');

 

  //显示变量结构

  var_dump($user);

 

  Model 基类可以传递三个参数:

  Model([\'模型名\'],[\'数据表前缀\'],[\'数据库连接信息\']); //实例化Model类,改变表前缀

  $user = new Model(\'User\',\'tp_\');

 

  //实例化Model类,定义数据库链接信息

  $user =new Model(\'User\',\'think_\',\'mysql://root:123456@localhost/thinkphp\');

 

  //打印出所有数据

  var_dump($user->select());

 

  使用 Model 基类还需要导入命名空间,而使用 M()方法,则不需要。

  //实例化Model类

  $user = M(\'User\');

 

  除了使用 Model 基类和 M()方法,还有一种对应数据表的模型定义,比如:UserModel。

  这种模型类并非必须定义的,只有当存在独立的业务逻辑或者属性的时候才需要。

  //User模型类

  namespace Home\\Model;

  use Think\\Model;

  class UserModel extends Model {}

  创建了 UserModel 模型类后,控制器那头就可以直接声明。

  //User模型类

  $user = new UserModel();

  var_dump($user->select());

  为什么 UserModel 模型类没有指定任何表即可直接访问呢?因为这种模型类基本是直接操作数据表的,所以在命名规范上和数据表名是对应的。

  虽然使用模型类和数据表对应较为方便,但当有时我们需要更换表名、前缀、附加数据库名等,就需要一些字段定义的操作。为了更加方便的了解数据表的变化,我们使用一下页

  面 Trace 工具,可以时时的查询 SQL 的变化。//页面Trace,调试辅助工具

  \'SHOW_PAGE_TRACE\' =>true,

  //重新定义表前缀

  class UserModel extends Model

  {

    protected $tablePrefix = \'abc_\';

  }

  //重新定义表名

  class UserModel extends Model

   {

    protected $tableName = \'abc\';

  }

  //重新定义完整的带前缀的表名

  class UserModel extends Model

   {

    protected $trueTableName = \'tp_abc\';

  }

  //附加数据库名

  class UserModel extends Model

   {

    protected $dbName = \'tp\';

  }

  如果你仅仅使用 CURD 等数据库基本操作,我们建议使用基于 Model 基类的 M()方法。

  使用 M()方法由于不需要加载具体的模型类(比如 UserModel 类),所以性能会更高。

  当然,如果有必要使用具体的模型类时,ThinkPHP 还提供了 D()方法来直接是实例化模型类,并且还可以免去引入命名空间等操作。

  //实例化UserModel类

  $user = D(\'User\');

  PS:使用 D()方法比直接使用模型类更加的智能,如果在\\Home\\Model\\UserModel 找不到该模型类,那么就会去公共模块下找\\Common\\Model\\UserModel 去找。如果还找不到,就会直接实例化基类 Model()类,也就是等同于使用 M()方法。

  D()方法可以直接调用当前模块的模型类,那么如果跨模块调用的话,那怎么处理呢?比如 Admin 后台模块,可以使用目录声明。

  //跨模块实例化

  $user = D(\'Admin/User\');

  有时,你可能想使用原生的 SQL 语句进行操作数据库。那么可以采用实例化空模型基类或者空 M()方法。

  //空 M()方法

  $user = M(); //或者new Model();空基类

  var_dump($user->query("SELECT * FROM think_user WHERE user=\'蜡笔小新 \'"));

 

  三.字段定义

  每个模型类操作着每个对应的数据表,在大多数情况下,系统会自动获取当前数据表的字段信息。而当模型类第一次实例化时,系统会自动缓存字段,并且永久缓存,除非删除了运行时缓存或者设置不缓存。

  如果调试模式下,则不会生成字段缓存文件,每次都是从数据表里重新获取。生成缓存的目的显而易见,就是为了快速响应。ThinkPHP 默认是开启字段缓存,因为在实际运行中,不会更改字段结构。

  字段缓存文件保存在 Runtime/Data/_fields/目录里,当你在开发阶段,字段和表会经常变动,所以要关闭缓存。关闭缓存的方法为:

  // 关闭字段缓存

  \'DB_FIELDS_CACHE\'=>false //开启了调试模式,自动关闭

  PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除 /Data/_fields 文件夹,重新获取字段。

  //查看字段结构

  var_dump($user->getDbFields());

  你也可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能,避免 IO 开销。

 

  //手动定义数据表字段,_pk表示主键

  class UserModel extends Model

   {

    protected $fields = array(\'id\', \'user\', \'_pk\'=>\'id\');

  }

 

  //type 定义每个字段的类型,可以永远字段验证

   class UserModel extends Model

  {

    protected $fields = array(\'id\', \'user\', \'_pk\'=>\'id\', \'type\'=>array(\'id\'=>\'smallint\',\'user\'=>\'varchar\'));

  }

以上是关于ThinkPHP--模型初步的主要内容,如果未能解决你的问题,请参考以下文章

关于THINKPHP5模型关联的初步理解

李炎恢PHP第4季视频教程 微博项目实战

ThinkPHP框架初步掌握

thinkphp的初步认识

初步学习thinkphp5.0

thinkphp模型查询加必要条件