thinkPHP中MVC模式的分析(一)_tp mvc分析-程序员宅基地

技术标签: thinkPHP框架学习  thinkphp  mvc  

thinkPHP中MVC模式的分析(一)

M(model)– 模型类

模型

在ThinkPHP中基础的模型类就是Think\Model 类,该类完成了基本的CURD、ActiveRecord模式、连贯操作和统计查询,一些高级特性被封装到另外的模型扩展中。

注意: 基础模型类的设计非常灵活,甚至可以无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的。

模型定义

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

模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义:

    namespace Home\Model;
    use Think\Model;
    class UserModel extends Model{
    
    }

模型类的作用大多数情况是操作数据库,按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表的。

模型名 约定对应数据表(假设数据表的前缀定义是think_)
UserModel think_user
UserTypeModel think_user_type
模型实例化
一、直接实例化

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

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

模型类通常都是继承系统的\Think\Model类,该类的构架方法格式为:
Model(['模型名'],['数据表前缀'],['数据库连接信息']);

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

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

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

数据库连接信息参数支持三种格式:
1. 字符串定义
字符串定义采用DSN格式定义,格式定义规范为:数据库类型://用户名:密码@数据库主机名或者IP:数据库端口/数据库名#字符集
例如:
new\Home\Model\NewModel('blog','think_','mysql://root:1234@localhost/demo');
2. 数组定义
可以传入数组格式的数据库连接信息,例如:
php
$connection = array(
'db_type' => 'mysql',
'db_host' => '127.0.0.1',
'db_user' => 'root',
'db_pwd' => '12345',
'db_port' => 3306,
'db_name' => 'demo',
'db_charset' => 'utf8',
);
new \Home\Model\NewModel('new','think_',$connection);

3. 配置定义
我们可以事先在配置文件中定义好数据库连接信息,然后在实例化的时候直接传入配置的名称即可,例如:
“` php
//数据库配置1
‘DB_CONFIG1’=>array(
‘db_type’=>’mysql’,
‘db_user’=>’root’,
‘db_pwd’=>’1234’,
‘db_host’=>’localhost’,
‘db_port’=>’3306’,
‘db_name’=>’thinkphp’
),
//数据库配置2
‘DB_CONFIG2’=>’mysql://root:1234@localhost:3306/thinkphp’,

```

在配置文件中定义数据库连接信息的时候也支持字符串和数组格式,格式和上面的实例传入参数一样
然后通过
new \Home\Model\NewModel('new','think_','DB_CONFIG1');
new \Home\Model\BlogModel('blog','think_','DB_CONFIG2');

通常我们都会在配置文件中配置相关参数,包括:

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

配置文件路径为 \Application\Common\Conf\config.php

二、D方法实例化

D方法其实就是通过实例化自定义模型类来操作数据库,一般在自定义模型类中通过M()方法来实例化数据表,当数据操作重复多次时,可以自定义模型类,然后在C层(控制层)直接调用模型类,可以减小代码重复性

实例化自定义模型类,eg.

<?php
//实例化模型
$User = D('User');
//相当于$User = new \Home\Model\UserModel();
//执行具体的数据操作
$User->select();
?>

\Home\Model\UserModel类不存在的时候,D函数会尝试实例化公共模块下面的\Common\Model\UserModel类,如果不存在,则会实例化系统的\Think\Model基类,同时对于已实例化过的模型,不会重复实例化。

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

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

三、M方法实例化模型

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

M方法其实就是通过公共模型类来实例化数据表

例如:

//使用M方法实例化
$User = M('User');
//同$User = new \Think\Model('User');
$User->select();

M方法跨模块操作,例如:

//使用M方法实例化操作db_name数据库的ot_user表
$User = M('db_name.User','ot_');
$User->select();

其实一般情况M方法和\Think\Model类的参数是一样的
$New = M('new','think_',$connection);//等效于$New = new \Think\Model('new','think_',$connection);

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

$User = M('\Home\Model\CommonModel:User','think_','db_config');
//相当于$User = new \Home\Model\CommonModel('User','think_','db_config');
实例化空模型

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sky_magic_sky/article/details/53369056

智能推荐

有效控制Android应用程序的耗电量_能有效控制安卓4.4.2耗电的软件是哪个-程序员宅基地

文章浏览阅读866次。如何才能降低Android应用程序的耗电量呢?今天再一次回顾了一下09年Google IO大会Jeffrey Sharkey的演讲(Coding for Life — Battery Life, That Is),与大家一起分享有效控制Android软件的耗电问题。AD: 51CTO在对尚邮架构师的访谈中曾经探讨过移动开发是否要重视移动终端软件的耗电问题_能有效控制安卓4.4.2耗电的软件是哪个

浅谈C#抽象方法、虚方法、接口-程序员宅基地

文章浏览阅读137次。每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心,他们常常一个人宅在家中!有上进心的,查查资料,学习新的知识,没上进心的,在家一日重复一..._c# 抽象方法与虚方法相结合事例

让你不得不学Python 的十大重要理由_不学python谚语-程序员宅基地

文章浏览阅读602次。简单易学Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。Python极其容易上手,因为Python有极其简单的说明文档。可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。可嵌入性:可以把Python嵌入C/C++程序,..._不学python谚语

Mysql 字段类型以及对应的长度 & 字节_数据表字段长度 63 64 128 255-程序员宅基地

文章浏览阅读1k次。字节篇字节历史美国人首先对英文字母进行编码,也就是最早的 ascii 码,用一个字节对的底7位来表示英文的128个字符。后来欧洲人发现128为根本不够用,法语中还有注音符这个怎么区分得把高一位编进来,这样欧洲普遍使用一个全字节进行编码,最多可表示256位。欧美人就是喜欢直来直去,字符少,编码用得位数少;但是即使位数少,不同国家地区用不同的字符编码,虽然0–127表示的符号是一样的,但是128–255这一段的解释完全乱套了,即使2进制完全一样,表示的字符完全不一样,比如135在法语,希伯来语,俄语编_数据表字段长度 63 64 128 255

No %s entity with id %s exists!报错_entity with id findbytoken exists-程序员宅基地

文章浏览阅读1k次。删除的时候报错No %s entity with id %s exists!说明需要删除的东西没有找到(一般来说是id),或已经被删除了查看后端,查看需要删除的是什么(一般是id,但可能会搞混id或者userid),为什么查询的东西没有找到..._entity with id findbytoken exists

前端开发常见的五种布局方式及应用场景_网格布局可以适应哪些环境-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏15次。前端开发常见的五种布局方式及应用场景1.静态布局:给页面元素设置固定的宽度和高度,单位用px,当窗口缩小,会出现滚动条,拉动滚动条显示被遮挡内容。优点:设计简单。缺点:对于不同尺寸屏幕的兼容性不好,特别是移动端。2.流式布局:元素的宽高用百分比做单位,元素宽高按屏幕分辨率调整,布局不发生变化。优点:页面元素宽高可以自适应调整。缺点:屏幕尺度跨度过大的情况下,页面不能正常显示。3.自适应布局:屏幕尺寸或分辨率变化时,页面元素会跟着变化。缺点:页面元素不会随着窗口大小的调整而发生变化。4.弹性布局_网格布局可以适应哪些环境

随便推点

【实验】编译原理——编译器认知实验_g++ -llvm-程序员宅基地

文章浏览阅读3.1k次,点赞6次,收藏30次。系列文章目录【学习笔记】编译原理——第一章 编译引论【学习笔记】编译原理——第二章 词法分析【实验】编译原理——语言认知实验文章目录系列文章目录一、实验目的二、实验内容三、实验步骤实验结果4.1 G++4.2 LLVM4.3 G++编译器优化4.4 LLVM编译器优化4.5 G++和LLVM优化对比五、实验心得一、实验目的本实验的目的是了解工业界常用的编译器 GCC 和 LLVM,熟悉编译器的安装 和使用过程,观察编译器工作过程中生成的中间文件的格式和内容,了解编译器 的优化效果,为编译器_g++ -llvm

随机信号处理功率谱估计 Music算法(Matlab)_matlab对任意信号进行music谱估计-程序员宅基地

文章浏览阅读1.6k次,点赞3次,收藏19次。Music算法-MatlabclearclcN_x=64; %信号长度N=64;%截取长度数目M=4;%信号频率个数包括负值f1=0.1;f2=0.13;n=1:N_x;SNR=-49:1:50;f2_expect=zeros(1,100);f1_expect=zeros(1,100);f2_mse=zeros(1,100);f1_mse=zeros(1,100);xn = 10*sin(2*pi*f1*n+pi/3) + 10*sin(2*pi*f2*n+pi/4); for_matlab对任意信号进行music谱估计

使用seajs模块化ajax动态生成表格功能_sea ajax-程序员宅基地

文章浏览阅读1.1k次。使用seajs将功能模块化的小实例:运用ajax技术将json文件内容转成表格显示在页面中。其他功能也可以使用相同模式,将其模块化。这样可以提高代码复用率,更快的实现功能需求!_sea ajax

Golang将两个int合并为string_go 语言int和string 拼接-程序员宅基地

文章浏览阅读1.6k次。//将int型a,b合并为string str1str1:=fmt.Sprintf("%d%d",a,b) _go 语言int和string 拼接

解决:Command `npm install --save --save-exact react-native` failed._error: command failed: npm install --save --save-e-程序员宅基地

文章浏览阅读5k次。解决:Command npm install --save --save-exact react-native failed.在Mac上使用 react-native init ProjectName 命令创建一个React_native项目是出现:Commandnpm install –save –save-exact react-nativefailed. google了很多方法都没有解决此问题_error: command failed: npm install --save --save-exact react-native

读《史蒂夫·乔布斯传》-程序员宅基地

文章浏览阅读176次。没想到在Scrum的官方书单中还找到了它,这本书还是我大学的时候在图书馆看的,趁这次机会,我准备又重新读一遍这本《史蒂夫·乔布斯传》。其实在第一次阅读这本书之前,我对史蒂夫乔布斯的认识仅仅只是停留在“前任苹果CEO”、“创造力不凡”而已。但是,当我在读了《乔布斯传》之后,才真正的理解到他作为一位伟人让人钦佩与敬仰的地方。乔布斯的执着、乔布斯的创新精神与他的完美主义和他那永不服输的精神正是我被他所感染的地方。“我们不应为别人而活,我们活着就是为了改变世界。”这是我很欣赏的他的一句话。也正如他所言,他在他的