首頁 >後端開發 >php教程 >thinkphp查詢,3.X 5.0方法

thinkphp查詢,3.X 5.0方法

陈政宽~
陈政宽~原創
2017-06-28 13:12:541621瀏覽

下面小編就為大家帶來一篇thinkphp查詢,3.X 5.0方法(親試可行)。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

一、介紹

#ThinkPHP內建了非常靈活的查詢方法,可以快速的進行資料查詢操作,查詢條件可以用於讀取、更新和刪除等操作,主要涉及到where方法等連貫操作即可,無論是採用什麼資料庫,你幾乎採用一樣的查詢方法(個別資料庫例如Mongo在表達式查詢方面會有所差異),系統幫你解決了不同資料庫的差異性,因此我們把框架的這個查詢方式稱之為查詢語言。查詢語言也是ThinkPHP框架的ORM亮點,讓查詢操作更簡單易懂。下面來一一講解查詢語言的內涵。

二、查詢方式

ThinkPHP可以支援直接使用字串作為查詢條件,但是大多數情況建議使用索引陣列或物件來作為查詢條件,因為會更加安全。

1.使用字串作為查詢條件

這是最傳統的方式,但是安全性不高,例如:

<?php 
$User = M("User"); // 实例化User对象 
$User->where(&#39;type=1 AND status=1&#39;)->select(); 
?>

最後產生的SQL語句是

SELECT * FROM think_user WHERE type=1 AND status=1

採用字串查詢的時候,我們可以配合使用新版提供的字串條件的安全預處理機制,暫且不再細說。

2.使用陣列作為查詢條件

#這種方式是最常用的查詢方式,例如:

<?php 
$User = M("User"); // 实例化User对象 
$condition[&#39;name&#39;] = &#39;thinkphp&#39;; 
$condition[&#39;status&#39;] = 1; 
// 把查询条件传入查询方法 
$User->where($condition)->select(); 
?>

最後產生的SQL語句是

SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

如果進行多重欄位查詢,那麼欄位之間的預設邏輯關係就是邏輯與AND,但用下面的規則可以更改預設的邏輯判斷,透過使用_logic 定義查詢邏輯:

<?php 
$User = M("User"); // 实例化User对象 
$condition[&#39;name&#39;] = &#39;thinkphp&#39;; 
$condition[&#39;account&#39;] = &#39;thinkphp&#39;; 
$condition[&#39;_logic&#39;] = &#39;OR&#39;; 
// 把查询条件传入查询方法 
$User->where($condition)->select(); 
?>

最後產生的SQL語句是

SELECT * FROM think_user WHERE `name` ='thinkphp' OR `account`='thinkphp'

#3.使用物件方式來查詢

##這裡以stdClass內建物件為例:

<?php 
$User = M("User"); // 实例化User对象 
// 定义查询条件 
$condition = new stdClass(); 
$condition->name = &#39;thinkphp&#39;; 
$condition->status= 1; 
$User->where($condition)->select(); 
?>

最後產生的SQL語句和上面一樣

SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1

使用物件方式查詢和使用數組查詢的效果是相同的,而且是可以互換的,大多數情況下,我們建議採用數組方式更有效率。

三、表達式查詢

上面的查詢條件只是一個簡單的相等判斷,可以用查詢表達式支援更多的SQL查詢語法,也是ThinkPHP查詢語言的精髓,

查詢表達式的使用格式:$map['字段名'] = array('表達式','查詢條件');

表達式不分大小寫,支援的查詢表達式有以下幾種,分別表示的意思是:

EQ 等於(=)

NEQ 不等於(a8093152e673feb7aba1828c43532094)
GT 大於(>)
EGT 大於等於(>=)
LT 小於(<)
ELT 小於等於(<=)
LIKE 模糊查詢
[NOT] BETWEEN (不在)區間查詢
[NOT] IN (不在)IN 查詢
EXP 表達式查詢,支援SQL語法

##範例如下:

1.EQ :等於(=)

例如:$map['id'] = array('eq',100);和下面的查詢等效$map['id'] = 100;表示的查詢條件就是id = 100

#2.NEQ: 不等於(a8093152e673feb7aba1828c43532094)

#例如:$map['id'] = array('neq',100);表示的查詢條件就是id a8093152e673feb7aba1828c43532094 100

3.GT:大於(>)

例如:$map['id'] = array('gt',100);表示的查詢條件就是id > 100

4.EGT:大於等於( >=)

例如:$map['id'] = array('egt',100);表示的查詢條件是id >= 100

#5.LT:小於(b8d59a18a6b0eccfb758fed0f22955e7'title|content'的話,使用$map['title'] = 'thinkphp';查詢條件就會變成name like '%thinkphp%'

支援數組方式:
#

例如 $map['a'] =array('like',array('%thinkphp%','%tp'),'OR'); $map['b']=array('notlike',array('%thinkphp%','%tp'),'AND');

生成的查询条件就是:

(a like '%thinkphp%' OR a like '%tp') AND (b not like '%thinkphp%' AND b not like '%tp')

8.[NOT] BETWEEN :同sql的[not] between, 查询条件支持字符串或者数组,

例如: $map['id'] = array('between','1,8');和下面的等效: $map['id'] = array('between',array('1','8'));

查询条件就变成 id BETWEEN 1 AND 8

9.[NOT] IN: 同sql的[not] in ,查询条件支持字符串或者数组,

例如: $map['id'] = array('not in','1,5,8');和下面的等效: $map['id'] = array('not in',array('1','5','8'));

查询条件就变成 id NOT IN (1,5, 8)

10.EXP:表达式,支持更复杂的查询情况

例如:$map['id'] = array('in','1,3,8');可以改成: $map['id'] = array('exp',' IN (1,3,8) ');

exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。查询表达式不仅可用于查询条件,也可以用于数据更新,例如:

<?php 
$User = M("User"); // 实例化User对象 
// 要修改的数据对象属性赋值 
$data[&#39;name&#39;] = &#39;ThinkPHP&#39;; 
$data[&#39;score&#39;] = array(&#39;exp&#39;,&#39;score+1&#39;);// 用户的积分加1 
$User->where(&#39;id=5&#39;)->save($data); // 根据条件保存修改的数据 
?>

四、快捷查询

从3.0版本开始,增加了快捷查询方式,可以进一步简化查询条件的写法,例如:

1.实现不同字段相同的查询条件

<?php 
$User = M("User"); // 实例化User对象 
$map[&#39;name|title&#39;] = &#39;thinkphp&#39;; 
// 把查询条件传入查询方法 
$User->where($map)->select(); 
?>

查询条件就变成

name= 'thinkphp' OR title = 'thinkphp'

2.实现不同字段不同的查询条件

<?php 
$User = M("User"); // 实例化User对象 
$map[&#39;status&title&#39;] =array(&#39;1&#39;,&#39;thinkphp&#39;,&#39;_multi&#39;=>true); 
// 把查询条件传入查询方法 
$User->where($map)->select(); 
?>

'_multi'=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = 'thinkphp',

查询字段支持更多的,例如:

$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);

查询条件就变成

status= 1 AND score >0 AND title = 'thinkphp'

注意:快捷查询方式中“|”和“&”不能同时使用。

五、区间查询

ThinkPHP支持对某个字段的区间查询,

例如: $map['id'] = array(array('gt',1),array('lt',10)) ;

得到的查询条件是: (`id` > 1) AND (`id` 13e6bb2942fd9623f93f45b2b42d7d12 3) OR (`id` 3a5daf68982d23e74067037833b54044 3)

最后一个可以是AND、 OR或者 XOR运算符,如果不写,默认是AND运算。


区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起,例如:

$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or');

最后的查询条件是:

(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')

六、组合查询

组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。

1.字符串模式查询(采用_string 作为查询条件)

数组条件还可以和字符串条件混合使用,例如:

<?php 
$User = M("User"); // 实例化User对象 
$map[&#39;id&#39;] = array(&#39;neq&#39;,1); $map[&#39;name&#39;] = &#39;ok&#39;; $map[&#39;_string&#39;] = &#39;status=1 AND score>10&#39;; $User->where($map)->select(); 
?>

最后得到的查询条件就成了:

( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )

2.请求字符串查询方式

请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。

<?php 
$map[&#39;id&#39;] = array(&#39;gt&#39;,&#39;100&#39;); 
$map[&#39;_query&#39;] = &#39;status=1&score=100&_logic=or&#39;; 
?>

得到的查询条件是:

`id`>100 AND (`status` = '1' OR `score` = '100')

七、复合查询

复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。

例如:

<?php 
$where[&#39;name&#39;] = array(&#39;like&#39;, &#39;%thinkphp%&#39;); 
$where[&#39;title&#39;] = array(&#39;like&#39;,&#39;%thinkphp%&#39;); 
$where[&#39;_logic&#39;] = &#39;or&#39;; 
$map[&#39;_complex&#39;] = $where; 
$map[&#39;id&#39;] = array(&#39;gt&#39;,1); 
?>

查询条件是

( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )

复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。

很多查询方式可以相互转换,例如上面的查询条件可以改成:

$where['id'] = array('gt',1);
$where['_string'] = ' (name like "%thinkphp%") OR ( title like "%thinkphp") ';

最后生成的SQL语句是一致的。

八、统计查询

在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括:

Count 统计数量,参数是要统计的字段名(可选)
Max 获取最大值,参数是要统计的字段名(必须)
Min 获取最小值,参数是要统计的字段名(必须)
Avg 获取平均值,参数是要统计的字段名(必须)
Sum 获取总分,参数是要统计的字段名(必须)

用法示例:

$User = M("User"); // 实例化User对象

获取用户数: $userCount = $User->count();

或者根据字段统计: $userCount = $User->count("id");

获取用户的最大积分: $maxScore = $User->max('score');

获取积分大于0的用户的最小积分: $minScore = $User->where('score>0')->min('score');

获取用户的平均积分: $avgScore = $User->avg('score');

统计用户的总成绩: $sumScore = $User->sum('score');

并且所有的统计查询均支持连贯操作的使用。

九、SQL查询

ThinkPHP内置的ORM和ActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理。主要包括下面两个方法:

1.query方法 :执行SQL查询操作

用法 query($sql,$parse=false)

参数 sql(必须):要查询的SQL语句

parse(可选):是否需要解析SQL

返回值 如果数据非法或者查询错误则返回false

否则返回查询结果数据集(同select方法)

使用示例

<?php 
$Model = new Model() // 实例化一个model对象 没有对应任何数据表 
$Model->query("select * from think_user where status=1"); 
?>

如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,而不管你的SQL语句是什么。

2.execute方法 :execute用于更新和写入数据的sql操作

用法 execute($sql,$parse=false)

参数 sql(必须):要执行的SQL语句

parse(可选):是否需要解析SQL

返回值 如果数据非法或者查询错误则返回false 否则返回影响的记录数

使用示例:

<?php 
$Model = new Model() // 实例化一个model对象 没有对应任何数据表 
$Model->execute("update think_user set name=&#39;thinkPHP&#39; where status=1"); 
?>

如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么。

十、动态查询

借助PHP5语言的特性,ThinkPHP实现了动态查询,核心模型的动态查询方法包括下面几种:

getBy 根据字段的值查询数据 例如,getByName,getByEmail
getFieldBy 根据字段查询并返回某个字段的值 例如,getFieldByName

1.getBy动态查询:该查询方式针对数据表的字段进行查询记录

例如,User对象拥有id,name,email,address 等属性,那么我们就可以使用下面的查询方法来直接根据某个属性来查询符合条件的记录。

<?php 
$user = $User->getByName(&#39;liu21st&#39;); 
$user = $User->getByEmail(&#39;liu21st@gmail.com&#39;); 
$user = $User->getByAddress(&#39;中国深圳&#39;); 
?>

暂时不支持多数据字段的动态查询方法,请使用find方法和select方法进行查询。

2.getFieldBy動態查詢:針對某個欄位查詢並傳回某個欄位的值,例如

$userId = $User->getFieldByName('liu21st',' id');

表示根據使用者的name取得使用者的id值。

十一、子查詢

從3.0版本開始新增了子查詢支持,有兩種使用方式:

1、使用select方法

當select方法的參數為false的時候,表示不進行查詢只是回傳建構SQL,例如:

// 建構子查詢SQL
$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)-> ;order('status')->select(false);

當select方法傳入false參數的時候,表示不執行目前查詢,而只是產生查詢SQL。

2、使用buildSql方法

$subQuery = $model->field('id,name')->table('tablename')-> ;group('field')->where($where)->order('status')->buildSql();

呼叫buildSql方法後不會進行實際的查詢操作,而只是產生該次查詢的SQL語句(為了避免混淆,會在SQL兩邊加上括號),然後我們直接在後續的查詢中直接呼叫。

//利用子查詢來查詢
$model->table($subQuery.' a')->where()->order()->select()

建構的子查詢SQL可用於ThinkPHP的連貫操作方法,例如table where等。

以上這篇thinkphp查詢,3.X 5.0方法(親試可行)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

以上是thinkphp查詢,3.X 5.0方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn