码迷,mamicode.com
首页 > Web开发 > 详细

ThinkPHP(学习笔记)

时间:2016-05-15 09:38:09      阅读:387      评论:0      收藏:0      [点我收藏+]

标签:

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:由于子查询用了不少连贯操作,我们会在连贯操作讲解。

ThinkPHP(学习笔记)

标签:

原文地址:http://www.cnblogs.com/zhengfengyun/p/5494511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!