标签:
ThinkPHP(学习笔记)
1.ThinkPHP--为什么要使用框架
学习要点:
1.框架和库
2.个人用框架的优势
3.公司用框架的优势
4.框架和开源系统
在正式学习 ThinkPHP 框架之前,我们首先要探讨一个问题——为什么要使用框架。它
的好处是什么?有哪些优势?对个人或公司运营有哪些帮助?
一.框架和库
库:英文是(Library)可以理解为仓库、图书馆、存书室。在程序里面理解,就是各种
代码的封装集合包,提供原生内置并不存在的功能和方法。
框架:英文是(Framework)可以理解为骨架、架构、书架、书框。在程序里面理解,
就各种条条框框像个有规则的书架一样,让你按照它的代码规范、编码模式(比如很多框架
是基于 MVC 模式的)去开发应用程序。当然,框架内可能也包含了库的功能,也提供了各
种封装功能的集合包。
那么使用框架开发有哪些优势呢?
二.个人用框架的优势
在个人项目开发中,使用框架比采用原生代码开发优势较为明显:
1.效率极高:因为框架已经帮你疏通了管道、构建了厂房、安好了水电、装全了设备、
排好了书架,你要做的就是按照书架的布局或规格,整齐的把书放上,就完了。如果你不用
框架建设,你还需要自己疏通管道、构建厂房、安水电、装设备、排书架,效率大大提高。
2.安全性高:框架的开发难度较高,一般都是身经百战的架构高手们经过多年、多版本
研发、更新迭代孕育而成。经过大量市场和用户的轮番测试和考验,保证了不同情况和状况
的稳定性。而如果你是低手或者新手,且自己架构,很有可能会遇到厂房崩塌、漏水漏电等
不安全的情况发生。
3.稳定性高:基本同上,因为各种部件进行有有条不紊的架构,导致在不同程度的运行
中保证流畅。而自行架构的,在某些极端情况下可能会遇到管道堵塞的问题发生。
PS:使用框架有这么多明显的优势,那对于个人开发者有必要学习那些原生的基础知识吗?答案是:必须要学习。首先,最基础的没有学好,在学习和使用框架的时候会到处碰
壁。其次,基础知识越扎实,在使用框架的深度和灵活度上要远高于不扎实的人,这是个人
竞争力的体现。
PS:一般对于职业生涯规划,我总结出可能会出现三种情况:1.努力学习基础知识,然
后学习一种或多种框架在工作中高效的使用,最终积累的各种资源,成立自己的工作室或公
司承办业务;2.努力学习基础知识,然后学习一种或多种框架在工作中高效使用,然后又返
璞归真深入研究原生,开发多款工具或开源框架,实现大牛级别;3.改行。三.公司用框架的优势
在公司团队项目开发中,使用主流框架比原生或自行开发框架优势较为明显:
1.团队协作力强:开源框架提供了统一的规范和编码模式,且模块与模块之间相对独立。对于程序员来说,只要根据这种规范来编码,团队之间的协调性会非常容易。而且主流的开
源框架在招募人才方面较为容易,上来就能使用,降低的培训成本。
2.降低培训成本:如果使用原生代码,当另一个团队人员接受或参与,几乎看不到懂之
前的技术员人代码,最终可能要重构,成本巨大。如果使用公司研发的框架,那么也需要一
定时间的培训才能上手,成本也是巨大的。而使用主流框架,大部分技术人员在来公司之前
就已经掌握。
3.去技术人员化:一个公司把核心代码掌握在某个技术人员手里,这是极其危险的事。当这个项目的原生或者自行开发的框架是某一个技术人员设计的,当他离职后,代码将是一
堆垃圾,没人能看懂。如果使用主流框架,那么公司的核心是项目和业务本身,降低技术人
员的价值。任何一个技术人员离职,都不会影响项目的研发进度,只要懂主流框架的技术人
员,上手即可继续。
PS:这里要声明一下,不同级别的公司在原生和自行开发框架、主流开源框架的认识上是有一定分歧的。技术型的大公司,不缺线,不缺技术人员,开发自己的框架主要解决自
己庞大的业务需求,其次是捍卫自己技术型公司的地位。而缺钱、缺人才的中小型公司,什
么都要自己研发,自己研发框架,自己研发前端库,然后用框架和库开发自己的论坛,内容
管理系统,商城系统。不用 discuz、dede、ecshop 之类的开源系统。最终导致烧完 100 万资
金,还欠发两个月工资,老板失踪,网站也没上线运营就倒闭了。
四.框架和开源系统
所谓开源系统,就是开放源代码的系统。这些系统,包括比如 discuz 论坛系统、phpcms
内容管理系统、shopex 商城系统。这些系统,都是定制某种领域功能的、已经开发好的系
统。原则上,这些系统已经不需要技术人员来编码了,可以直接上线运营了。因为这些是定
制的系统,所以系统会专门根据此领域的情况进行特定的优化。那么也就是说,这些开源系
统在安全性、稳定性和效率上要高于用框架开发的同类产品。所以,很多公司大量招聘开源
系统的二次开发人才。
那么到底是学框架开发,还是学开源系统的二次开发呢?我的建议是,先学基础(比如
PHP1,2,3 季度),再学框架(PHP 第 4 季)。之后如果对开源系统的二次开发感兴趣,其实
有了这么多基础,直接看 API 就非常容易了,都不需要专门做视频指引。
2. ThinkPHP--安装与配置
学习要点:
1.获取 ThinkPHP
2.入口文件
3.自动生成
4.访问控制器
ThinkPHP 是一款免费开源的框架,基于 MVC 设计模式和面向对象开发。
一.获取 ThinkPHP
我们直接登录 ThinkPHP 的官网下载频道:http://www.thinkphp.cn/down.html,选择最新
的 ThinkPHP3.2.1 正式完整版即可。
由于最新版本采用了命名空间等新特性,所以框架对于 PHP 版本的最低要求是 5.3+。
其他需求一般都支持,我们直接使用 wamp 即可满足所有要求。
解压 ThinkPHP3.2.1,打开它或导入到项目中去,展开六个文件及文件夹:
Application |
--应用程序目录,当程序开发时自动生成,默认为空; |
Public |
--公共资源文件目录,存放一些公用的文件,默认为空; |
ThinkPHP |
--框架目录,框架的核心架构程序包; |
README.md |
--说明文件,可删; |
.htaccess |
--配置文件,一般用于配置伪静态; |
Index.php |
--入口文件,所有程序都通过这里访问。 |
对于 ThinkPHP 框架目录内,也含有大量的目录及文件:
Common |
--核心公共函数目录 |
Conf |
--核心配置目录 |
Lang |
--核心语言包目录 |
Library |
--框架类库目录 |
|--Think |
--核心 Think 类库包目录 |
|--Behavior |
--行为类库目录 |
|--Org |
--Org 类库包目录 |
|--Vendor |
--第三方类库目录 |
|--... |
--更多类库目录 |
Mode |
--框架应用模式目录 |
Tpl |
--系统模版目录 |
LICENSE.txt |
--框架授权协议文件 |
logo.png |
--框架 LOGO 文件 |
README.txt |
--框架 README 文件 |
index.php --框架入口文件二.入口文件
ThinkPHP 采用单一入口模式对项目进行部署和访问的,所以我们需要通过 index.php 进行一些部署工作,保证其正确访问。
1.将完整版压缩包解压的内容,拷贝到指定的服务器文件夹内,比如 demo39;
2.打开 ThinkPHP 提供的 index.php 文件,我们发现如下代码:
//检测PHP环境
if(version_compare(PHP_VERSION,‘5.3.0‘,‘<‘)) die(‘require PHP >
5.3.0 !‘);
//开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define(‘APP_DEBUG‘,True);
//定义应用目录
define(‘APP_PATH‘,‘./Application/‘);
//引入ThinkPHP入口文件
require ‘./ThinkPHP/ThinkPHP.php‘;
3.如果想按照自己的意愿设置应用目录名称,可以修改成这样:
//修改应用目录
define(‘APP_PATH‘,‘./Weibo/‘);
//修改框架目录
require ‘./Think/ThinkPHP.php‘;
当第一次运行了这个配置后的应用程序,将会在根目录生成一个 Weibo 文件夹,应用
程序的所有文件将全部存放在这里。三.自动生成
当第一次访问应用入口文件的时候,会自动生成 Weibo 这个应用程序目录。里面包含
了各种目录,说明如下:
Common --应用公共模块
|--Common --应用公共函数目录
|--Conf --应用公共配置文件目录
Home --默认生成的 Home 模块
|--Conf --模块配置文件目录
|--Common --模块函数公共目录
|--Controller --模块控制器目录
|--Model --模块模型目录
|--View --模块视图文件目录
Runtime --运行时目录 |--Cache --模版缓存目录
|--Data --数据目录
|--Logs --日志目录
|--Temp --缓存目录 index.php 只有一个入口,就是应用程序入口。如果有多个站,或者后台,那就需要另一个入口。
创建一个 admin.php,应用目录改成对应的即可。
//修改应用目录
define(‘APP_PATH‘,‘./Admin/‘);
在自动生成的目录中,为了防止访问到应用程序的目录结构,会创建个index.html文
件。当然,你也可以自行设置。
//设定目录生成的文件
define(‘DIR_SECURE_FILENAME‘, ‘default.html‘);
//设置目录页面内容
define(‘DIR_SECURE_CONTENT‘, ‘目录禁止‘);
一般来说,第一次生成应用程序,应该加上静态主页防止目录结构暴露。但如果你的环
境非常安全,可以关闭生成静态主页。
//禁止目录主页生成
define(‘BUILD_DIR_SECURE‘, false);
四.访问控制器
控制器路径在:Weibo/Home/Controller 下,有一个默认的控制器 IndexController.class.php
文件。
控制器类的命名方式:控制器名(驼峰式,首字母大写)+Controller 控制器文件的命名方式:类名+class.php 创建一个控制器需要三个部分:1.设置命名空间;2.导入命名空间;3.控制器类
//设置命名空间
namespace Home\Controller; //设置命名空间,就是当前目录
//导入命名空间
use Think\Controller; //继承父类用到Controller类
//控制器类
class IndexController extends Controller { public function index() { //...
}
}
除了首页直接访问:http://localhost/demo39/,如果想用完整形式则是: http://localhost/demo39/index.php/Home/Index/index。在这里的完整URL中,index.php是单一入口文件,Home是主模块,Index是控制器名,
index是控制器里的一个方法。注意:这里大小写区分,因为在Linux是区分大小写的。如果创建一个test()方法,那么URL就是:
http://localhost/demo39/index.php/Home/Index/test
如果想创建一个User模块,那么可以创建一个User控制器。
namespace Home\Controller; use Think\Controller;
class UserController extends Controller { public function index() { echo ‘user‘;
}
}
URL访问路径为:http://localhost/demo39/index.php/Home/User/index
3. ThinkPHP--模块化和 URL 模式
学习要点:
1.模块化设计
2.URL 模式
本节课,我们主要探讨两个问题。一个是 ThinkPHP3.2.1 的模块化设计,可以支持多
模块的应用创建;第二个就是 URL 模式,提供了多种 URL 显示方式。
一.模块化设计
在上一节,我们直接复制 index.php 创建了 admin.php 文件。这样会自动生成两个目录,
分别为 Weibo 和 Admin,前者代表前台,后者代表后台。那么现在采用 ThinkPHP 模块化架
构思想,可以把 Weibo 内的 Home 目录当作前台、Weibo/Admin 目录当作后台。
操作方法:把 Home 目录复制一份到同级目录,改名为 Admin。把 Admin 中的 Controller
内的 IndexController.class.php 的命名空间改为如下:
//修改Admin模块的命名空间
namespace Admin\Controller;
最终访问的地址就是:http://localhost/demo39/index.php/Admin
有一些模块我们希望是被用户禁止访问的,比如Common和Runtime模块。当然,框
架已经在默认就禁止访问了。
当强行访问Common模块的时候,会提示:“无法加载模块:Common”的错误信息。
//禁止访问模块 |
|
‘MODULE_DENY_LIST‘ |
=> array(‘Common‘,‘Runtime‘), |
PS:当你去掉数组里的‘Common‘,那么会提示:“无法加载控制器:Index”的错误信
息。说明这个模块已经可以访问了。
//禁止访问模块,添加一个Admin模块
‘MODULE_DENY_LIST‘ => array(‘Common‘,‘Runtime‘,‘Admin‘),
有禁止访问模块的设置,就有允许访问模块的设置。当设置了此选项,就务必把所有允
许访问的模块都添加上,否则会变成拒绝访问。
//允许访问的模块,设置了,就必须写全,漏写的将无法访问
‘MODULE_ALLOW_LIST‘ => array(‘Home‘,‘Admin‘),
如果有多个访问模块,那么在默认URL访问的时候,应该有一个首选访问。默认是Home,
想设置Admin为默认,可以这么设置:
//设置默认起始模块
‘DEFAULT_MODULE‘ => ‘Admin‘, 应用项目如果只允许单个模块的话,可以设置拒绝多个模块,这样创建更多的模块将失
效。
//单模块设置
‘MULTI_MODULE‘ => false, 有时,你会觉得index.php/Admin这样很麻烦。你可能想直接admin.php就代表后
台就方便很多,那么可以使用多入口设置。
这里的多入口和上一节多个应用项目不同,而是通过admin.php访问Weibo目录下的
Admin模块。将index.php复制出来改成admin.php,然后添加如下代码:
//默认指向Admin模块
$_GET[‘m‘] = ‘Admin‘;
//默认指向Index控制器 $_GET[‘c‘] = ‘Index‘;
二.URL 模式
ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式、 REWRITE和兼容模式。
http://localhost/demo39/index.php/模块/控制器/操作
//用户密码传参
class UserController extends Controller { public function test($user, $pass) { echo ‘user:‘.$user.‘<br />pass:‘.$pass; }
}
//PATHINFO模式 http://localhost/demo39/index.php/Home/User/test/user/Lee/pass/123
在这条URL上,Home表示模块,User表示控制器,test表示方法,user/Lee表示
第一个键值对,pass/123表示第二个键值对。
PATHINFO模式下默认的分隔符是/,我们可以设置为你想要的,比如:_
//设置键值对分隔符
‘URL_PATHINFO_DEPR‘=>‘_‘,
设置了分隔符的URL:
http://localhost/demo39/index.php/Home_User_test_user_Lee_pass_123
//普通模式
http://localhost/demo39/index.php?m=Home&c=User&a=test&user=Lee&pass
=123
在这条URL上,我们发现采用的就是传统的GET模式,m表示模块,c表示控制器,a 表示方法,后面的表示键值对。
普通模式的m、c、a可以自行设置为你习惯的键名称:
//修改键名称
‘VAR_MODULE‘ |
=> ‘mm‘, |
‘VAR_CONTROLLER‘ |
=> ‘cc‘, |
‘VAR_ACTION‘ |
=> ‘aa‘, |
http://localhost/demo39/index.php?mm=Home&cc=User&aa=test&user=Lee&p
ass=123
//REWRITE模式(重写模式) httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride None 将None改为 All
把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下
这样,ThinkPHP自带的.htaccess文件就起作用了,可以过滤掉index.php这个字
符串。
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
//去除了index.php http://localhost/demo39/Home/User/test/user/Lee/pass/123
PS:兼容模式一般用于不支持 PATHINFO 的特殊环境,基本上用不到。
4. 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或sqlsrv |
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模型类没有指定任何表即可直接访问呢?因为这种模型类基本是直
接操作数据表的,所以在命名规范上和数据表名是对应的。
模型类与数据表对应规范
模型名 |
对应的数据表(假设前缀是think_) |
UserModel |
think_user |
UserTypeModel |
think_user_type |
虽然使用模型类和数据表对应较为方便,但当有时我们需要更换表名、前缀、附加数据
库名等,就需要一些字段定义的操作。为了更加方便的了解数据表的变化,我们使用一下页
面Trace工具,可以时时的查询SQL的变化。
//页面Trace,调试辅助工具
‘SHOW_PAGE_TRACE‘ =>true,
数据表定义
字段属性 |
说明 |
tablePrefix |
定义模型对应数据表的前缀 |
tableName |
不包含表前缀的数据表名称 |
trueTableName |
包含表前缀的数据表名称 |
dbName |
定义模型当前对应的数据库名称 |
//重新定义表前缀
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‘));
}
5. ThinkPHP--SQL 查询语句
学习要点:
1.查询方式
2.表达式查询
3.快捷查询 4.区间查询 5.组合查询 6.统计查询
7.动态查询 8.SQL 查询
本节课,我们将学习 ThinkPHP 中对于 SQL 查询语句,包含了基本的查询方式、表达
式查询、快捷查询、区间查询、组合查询、统计查询、SQL 查询、动态查询和子查询。一.查询方式
ThinkPHP提供了三种基本的查询方式:字符串条件查询、索引数组条件查询和对象条
件查询。在大多数情况下,推荐使用索引数组和对象方式作为查询条件,因为会更加安全
1.使用字符串作为条件查询
//字符串作为条件查询
$user = M(‘User‘); var_dump($user->where(‘id=1 AND user="蜡笔小新"‘)->select());
//最终生成的SQL语句
SELECT * FROM `think_user` WHERE ( id=1 AND user="蜡笔小新" )
PS:where查询方法里面只要包含条件即可,多个条件加上AND等连接符即可。我们会
在SQL连贯操作详细学习。
2.使用索引数组作为查询条件
//索引数组作为条件查询
$user = M(‘User‘);
$condition[‘id‘] = 1;
$condition[‘user‘] = ‘蜡笔小新‘; var_dump($user->where($condition)->select());
//最终生成的SQL语句
SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = ‘蜡笔小新‘ ) PS:索引数组查询的默认逻辑关系是AND,如果想改变为OR,可以使用_logic定义查
询逻辑。
基于上面的代码增加如下一行:
$condition[‘_logic‘] = ‘OR‘; 3.使用对象方式来查询 //对象作为条件查询 $user = M(‘User‘); $condition = new \stdClass(); $condition->id = 1; $condition->user = ‘蜡笔小新‘; |
//将默认AND改成OR |
var_dump($user->where($condition)->select());
//最终生成的SQL语句
SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = ‘蜡笔小新‘ )
PS:stdClass类是PHP内置的类,可以理解为一个空类,在这里可以理解为把条件的字段作为成员保存到stdClass类里。而这里的‘\‘是将命名空间设置为根目录,否则会导
致当前目录找不到此类。使用对象和数组查询,效果是一样的,可以互换。在大多数情况下,
ThinkPHP推荐使用数组形式更加高效。
二.表达式查询
对于那些要实现模糊判断的查询,比如大于、等于、小于之类的SQL查询,可以使用表
达式查询方式。
查询表达式格式:$map[‘字段名‘] = array(‘表达式‘,‘查询条件‘); 表达式查询表
表达式 |
含义 |
EQ |
等于(=) |
NEQ |
不等于(<>) |
GT |
大于(>) |
EGT |
大于等于(>=) |
LT |
小于(<) |
ELT |
小于等于(<=) |
[NOT]LIKE |
模糊查询 |
[NOT] BETWEEN |
(不在)区间查询 |
[NOT] IN |
(不在)IN查询 |
EXP |
表达式查询,支持SQL语法 |
PS:表达式不区分大小写。
//EQ:等于(=)
$map[‘id‘] = array(‘eq‘, 1); //NEQ:不等于(<>) |
//where为id=1 |
$map[‘id‘] = array(‘neq‘, 1); //GT:大于(>) |
//where为id<>1 |
$map[‘id‘] = array(‘gt‘, 1); //EGT:大于等于(>=) |
//where为id>1 |
$map[‘id‘] = array(‘egt‘, 1); //LT:小于(<) |
//where为id>=1 |
$map[‘id‘] = array(‘lt‘, 1); //ELT:小于等于(<=) |
//where为id<1 |
$map[‘id‘] = array(‘elt‘, 1); //[NOT]LIKE:模糊查询 |
//where为id<=1 |
$map[‘user‘] = array(‘like‘, ‘%小%‘); //[NOT]LIKE:模糊查询 |
//where为like %小% |
$map[‘user‘] = array(‘notlike‘, ‘%小%‘); |
//where为not like %小% |
//[NOT]LIKE:模糊查询的数组方式
$map[‘user‘] = array(‘like‘, array(‘%小%‘, ‘%蜡%‘), ‘AND‘);
*SELECTFR(//生成的SQL) OM `think_user` WHERE ( (`user` LIKE ‘%小%‘ AND `user`
LIKE ‘%蜡%‘) )
//[NOT] BETWEEN:区间查询
$map[‘id‘] = array(‘between‘,‘1,3‘); //where为`id` BETWEEN ‘1‘ AND ‘2‘
//同上等效
$map[‘id‘] = array(‘between‘,array(‘1‘,‘3‘));
//[NOT] BETWEEN:区间查询
$map[‘id‘] = array(‘not between‘,‘1,3‘);
//where为`id` NOT BETWEEN ‘1‘ AND ‘2‘
//[NOT] IN:区间查询
$map[‘id‘] = array(‘in‘,‘1,2,4‘);
//where为`id` IN (‘1‘,‘2‘,‘4‘)
//[NOT] IN:区间查询
$map[‘id‘] = array(‘not in‘,‘1,2,4‘);
//where为`id` NOT IN (‘1‘,‘2‘,‘4‘)
//EXP:自定义
$map[‘id‘] = array(‘exp‘,‘in (1,2,4)‘);
//where为`id` NOT IN (‘1‘,‘2‘,‘4‘)
PS:使用exp自定义在第二个参数直接写where语句即可
//EXP:自定义增加OR语句
$map[‘id‘] = array(‘exp‘, ‘=1‘);
$map[‘user‘] = array(‘exp‘, ‘="蜡笔小新"‘); $map[‘_logic‘] = ‘OR‘;
//WHERE 为( (`id` =1) ) OR ( (`user` ="蜡笔小新") )
三.快捷查询
快捷查询方式是一种多字段查询的简化写法,在多个字段之间用‘|‘隔开表示OR,用‘&‘
隔开表示AND。 1.不同字段相同查询条件 //使用相同查询条件 $user = M(‘User‘); |
|
$map[‘user|eemail‘] = ‘a‘; |
//‘|‘换成‘&‘变成AND |
var_dump($user->where($map)->select());
2.不同字段不同查询条件
//使用不同查询条件
$user = M(‘User‘);
$map[‘id&user‘] = array(1,‘蜡笔小新‘,‘_multi‘=>true); var_dump($user->where($map)->select());
PS:设置‘_multi‘为true,是为了让id对应1,让user对应‘蜡笔小新‘,否则就会出现id对应了1还要对应‘蜡笔小新‘的情况。而且,这设置要在放在数组最后。
//支持使用表达式结合快捷查询
$user = M(‘User‘);
$map[‘id&user‘] = array(array(‘gt‘, 0),‘蜡笔小新‘,‘_multi‘=>true); var_dump($user->where($map)->select());
四.区间查询
ThinkPHP 支持对某个字段的区间查询。
//区间查询
$user = M(‘User‘);
$map[‘id‘] = array(array(‘gt‘, 1), array(‘lt‘, 4)); var_dump($user->where($map)->select());
//第三个参数设置逻辑OR
$user = M(‘User‘);
$map[‘id‘] = array(array(‘gt‘, 1), array(‘lt‘, 4), ‘OR‘); var_dump($user->where($map)->select());
五.组合查询组合查询是基于索引数组查询方式的一个扩展性查询,添加了字符串查询(_string)、复
合查询(_complex)、请求字符串查询(_query),由于采用的是索引数组,重复的会被覆盖。
//字符串查询(_string) $user = M(‘User‘);
$map[‘id‘] = array(‘eq‘, 1);
$map[‘_string‘] =‘user="蜡笔小新" AND email="xiaoxin@163.com"‘; var_dump($user->where($map)->select());
//请求字符串查询(_query) $user = M(‘User‘);
$map[‘id‘] = array(‘eq‘, 1);
$map[‘_query‘] =‘user=蜡笔小新&email=xiaoxin@163.com&_logic=OR‘; var_dump($user->where($map)->select());
PS:这种方式是URL方式,不需要加引号。
//复合查询(_complex)
$user = M(‘User‘);
$where[‘user‘] = array(‘like‘, ‘%小%‘);
$where[‘id‘] = 1;
$where[‘_logic‘] = ‘OR‘;
$map[‘_complex‘] = $where;
$map[‘id‘] = 3; $map[‘_logic‘] = ‘OR‘; var_dump($user->where($map)->select());
PS:复合查询可以构建更加复杂的查询,这里id=1或者id=3可以构建实现。六.统计查询
ThinkPHP提供了一些数据统计查询的方法。
//数据总条数
$user = M(‘User‘); var_dump($user->count());
//字段总条数,遇到NULL不统计
$user = M(‘User‘); var_dump($user->count(‘email‘));
//最大值
$user = M(‘User‘); var_dump($user->max(‘id‘));
//最小值
$user = M(‘User‘); var_dump($user->min(‘id‘));
//平均值
$user = M(‘User‘); var_dump($user->avg(‘id‘));
//求总和
$user = M(‘User‘); var_dump($user->sum(‘id‘));
七.动态查询
借助PHP5语言的特性,ThinkPHP实现了动态查询。
1.getBy动态查询
//查找email=xiaoin@163.com的数据 $user = M(‘User‘);
var_dump($user->getByemail(‘xiaoxin@163.com‘));
2.getFieldBy动态查询
//通过user得到相对应id值
$user = M(‘User‘);
var_dump($user->getFieldByUser(‘路飞‘, ‘id‘));
八.SQL查询
ThinkPHP支持原生SQL查询。
1.query读取
//查询结果集,如果采用分布式读写分离,则始终在读服务器执行
$user = M(‘User‘);
var_dump($user->query(‘SELECT * FROM think_user‘));
2.execute写入
//更新和写入,如果采用分布式读写分离,则始终在写服务器执行
$user = M(‘User‘); var_dump($user->execute(‘UPDATE think_user set user="蜡笔大新" WHERE
id=1‘));
PS:由于子查询用了不少连贯操作,我们会在连贯操作讲解。
标签:
原文地址:http://www.cnblogs.com/zhengfengyun/p/5494511.html