加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

ThinkPHP教程_PHP框架之ThinkPHP(六)【实例化模型、模型命名和

发布时间:2022-10-28 15:01:06 所属栏目:PHP教程 来源:转载
导读: 1、实例化模型php
在ThinkPHP2.0及以上版本中,能够无需进行任何模型定义。只有在须要封装单独的业务逻辑时,模型类才是必须定义的,所以ThinkPHP在模型上有不少灵活性和方便性,而没必要由

1、实例化模型php

在ThinkPHP2.0及以上版本中,能够无需进行任何模型定义。只有在须要封装单独的业务逻辑时,模型类才是必须定义的,所以ThinkPHP在模型上有不少灵活性和方便性,而没必要由于表太多而烦恼数据库

ThinkPHP有几种实例化模型的方法缓存

一、实例化基础模型类框架

即实例化系统自带的Model类,ThinkPHP会自动帮咱们找到数据库中相应的表,并获取其字段(表结构信息)函数

·$User=new Model('User');测试

·$User=M('User');(快捷方法,经过M()函数)ui

大写字母与下划线关系(think_是在配置文件中设置的表前缀)spa

实例化基础模型类传递进去的参数在数据库中对应的表名设计

User think_user调试

UserMessage think_user_message

ps,由于表前缀中已经有了一个下划线php实例教程,因此user对应的也是think_user

二、实例化其它模型类

第一种实例化方法由于没有涉及自定义模型类,所以很难封装一些自定义的业务逻辑(由于ThinkPHP自带的基础模型类显然只提供了基本的CRUD操做等等一些操做,确定是没法知足项目业务逻辑的,因此必须自定义模型类来封装自定义业务逻辑),若是只须要扩展一些通用的(所谓通用,就是多个针对不一样表的模型类都须要用到的逻辑)自定义业务逻辑,那么能够采用这种方式

·$User=new CommonModel('User');

·$User=M('User','CommonModel');(快捷方式,经过M()函数)

ps,CommonModel类是一个自定义模型类,在应用目录->Lib目录->Model目录->CommonModel.class.php文件中

由于ThinkPHP是自动加载模型类的,因此在实例化模型类以前不须要手动模型类文件的导入,即不须要require '模型类文件';等

自定义模型类必须继承系统自带的模型类(好比说Model类),并且没有别名导入的话,自定义模型类文件必须放在应用目录->Lib目录->Model目录下

能够在CommonModel类里面定义一些通用的逻辑方法,就能够省去为每一个数据表定义具体的模型类,若是你的项目已经有超过100个数据表了,而大多数状况都是一些基本的CURD操做的话,只是个别模型有一些复杂的业务逻辑须要封装,那么第一种方式和第二种方式的结合是一个不错的选择。

三、实例化自定义模型类

得先定义针对不一样表的自定义模型类,好比说UserModel类,UserMessagesModel类等等,而后再进行实例化。这种方式是用的最多的

·$User=new UserModel;

·$User=D('User');(快捷方式,经过D()函数),D()函数有自动检测自定义模型类的功能,若是应用目录->Lib目录->Model目录下存在所传入参数对应的自定义模型类(即参数User对应于自定义模型类UserModel),那么就会实例化该自定义模型类,不然则实例话系统自带的模型类(Model类)。并且对于已经实例化过的模型不会重复实例化,默认的D()函数只能实例化当前应用的模型类,不能跨应用实例化模型类,若是想实例化其它应用的模型类,则能够$User=D('User','其它应用名');,若是启用了模块分组,则能够$Usr=D('其它分组名.User');

ps,这种实例化模型方式与上一种方式有何区别,其实上一种方式最大的特征就是通用。对于一张表,若是你只想对其进行简单的CRUD操做,则采用第一种方式便可;若是你不只想对其进行简单的CRUD操做,还想用到一些该项目其它表通用的自定义逻辑操做,则采用第二种方式;若是不只想对其进行CRUD操做,还想用到一些自定义的逻辑操做,并且这些逻辑操做只有该表用到(即不须要用到其它表通用的自定义逻辑操做),则采用第三种方式

四、实例化一个空模型类

若是仅仅是想使用原生SQL的话,不须要使用额外的模型类,能够选择实例化一个空模型类

·$Model=new Model();

·$Model=M();(快捷方式,经过M()函数)

好比说$Model->query('SELECT * FROM think_user where status=1');

不论是采用哪种方式,以及不论是采用new、M()或者D()进行实例化模型类,都会ThinkPHP都会自动加载数据库链接信息去链接数据库,若是数据库链接失败也是会报错的

关于数据表字段缓存,索引表示表字段,关联表示表的一些属性

若是开启数据表字段缓存,则ThinkPHP是不理会任何有关表结构的修改操做的,也就是说,即便修改了表结构,ThinkPHP也会按照数据表字段缓存文件中的表结构对表进行操做,除非手动删除数据表字段缓存文件。那么不难看出(并通过测试),ThinkPHP的数据表字段缓存机制是这样的,在进行数据库操做以前,先判断是否开启数据表字段缓存,若是开启,则检索一下应用目录->Runtime目录->Data目录->_field目录中有无相应表的数据表字段缓存文件,如有,则加载该文件中的表结构,而后对相应表进行操做,若无,则先操做数据库获取到表结构,而后再对相应表进行操做,并将刚才获取到的表结构缓存起来;若是没有开启则直接先操做数据库获取表结构,而后再对相应表进行操做!这段话能够简化成以下代码,O(∩_∩)O哈哈~

当开启APP_DEBUG(调试模式)以后,模板中的框架集就不能显示了!这是由于Trace等信息是放在中的,而框架集中是不能存在的,从而致使显示一片空白2、模型命名和获取字段

一、关于模型命名

到这里,基本是已经明确了自定义模型名与数据表名之间的对应关系。也就是说,自定义模型类会根据去名称其对相应的表进行操做,那么假如要求自定义模型类不根据其表名对相应的数据表进行操做该怎么办呢(即跨表操做)?答案是能够经过Model类的以下两个属性(protected属性)进行操做

·$tableName

不包含表先后缀的数据表名称,与自定义模型类名(或自带的模型类中实例化时传入的参数)相对应,可是能够修改该属性,来让自定义模型类操做与其名称不对应的表

·$trueTableName

包含表先后缀的数据表名称,默认为null,即数据库中的真实表名

通过测试,三者的优先级应该以下

自定义模型类中本身指定的$trueTableName>自定义模型类中本身指定的$tableName>ThinkPHP自带的模型类中默认的$tableName

也就是说设置了$trueTableName就按$trueTableName的来,不然按$tableName、最后按默认的

除了能够对默认的数据表进行修改以外还能够对默认的数据库进行修改,使用$dbName属性!只有在当前的模型类对应的数据库名称和配置文件不一样的时候才须要定义,以实现跨库操做

关于表后缀,手册上说的一段话以下

二、获取字段

关于这段逻辑,不知道有想法的同志有没有思考过,就是对数据表进行操做以前必要进行这样的判断和文件加载等等操做吗?为啥不直接将表结构信息告诉模型,那么就省去了这么多麻烦,直接对数据表就能够进行操做,显然节省IO开销,而且省掉一次查询数据库获取表结构的数据库操做,提高效率!对,ThinkPHP的设计者也考虑到了这一点,就设计了$field属性

·ThinkPHP的默认认为数据表的主键字段名都是id,而且自动增加

·$User->getPk();能够获取User表的主键

·$User->getDbFields();能够获取User表的全部字段信息

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!