$User = M("User"); // 實例化User對象
$User->where('type=1 AND status=1')->select(); 最后生成的SQL語句是
SELECT * FROM think_user WHERE type=1 AND status=1 1 二、使用數組作為查詢條件
$User = M("User"); // 實例化User對象
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
// 把查詢條件傳入查詢方法
$User->where($condition)->select(); 最后生成的SQL語句是
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
如果進行多字段查詢,那么字段之間的默認邏輯關系是 邏輯與 AND,但是用下面的規則可以更改默認的邏輯判斷,通過使用 _logic 定義查詢邏輯:
$User = M("User"); // 實例化User對象
$condition['name'] = 'thinkphp';
$condition['account'] = 'thinkphp';
$condition['_logic'] = 'OR';
// 把查詢條件傳入查詢方法
$User->where($condition)->select(); 最后生成的SQL語句是
SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp' 1 三、使用對象方式來查詢 (這里以stdClass內置對象為例)
$User = M("User"); // 實例化User對象
// 定義查詢條件
$condition = new stdClass();
$condition->name = 'thinkphp';
$condition->status= 1;
$User->where($condition)->select(); 最后生成的SQL語句和上面一樣
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
使用對象方式查詢和使用數組查詢的效果是相同的,并且是可以互換的,大多數情況下,我們建議采用數組方式更加高效,后面我們會以數組方式為例來講解具體的查詢語言用法。 5
表達式 | 含義 |
---|---|
$map['id'] = array('eq',100); 和下面的查詢等效
$map['id'] = 100; 表示的查詢條件就是 id = 100
NEQ: 不等于(<>)
例如:
$map['id'] = array('neq',100); 表示的查詢條件就是 id <> 100
GT:大于(>)
例如:
$map['id'] = array('gt',100); 表示的查詢條件就是 id > 100
EGT:大于等于(>=)
例如:
$map['id'] = array('egt',100); 表示的查詢條件就是 id >= 100
LT:小于(<)
例如:
$map['id'] = array('lt',100); 表示的查詢條件就是 id < 100
ELT: 小于等于(<=)
例如:
$map['id'] = array('elt',100); 表示的查詢條件就是 id <= 100
[NOT] LIKE: 同sql的LIKE
例如:
$map['name'] = array('like','thinkphp%'); 查詢條件就變成 name like 'thinkphp%'
如果配置了DB_LIKE_FIELDS參數的話,某些字段也會自動進行模糊查詢。例如設置了:
'DB_LIKE_FIELDS'=>'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')
[NOT] BETWEEN :同sql的[not] between, 查詢條件支持字符串或者數組,例如:
$map['id'] = array('between','1,8'); 和下面的等效:
$map['id'] = array('between',array('1','8')); 查詢條件就變成 id BETWEEN 1 AND 8
[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)
EXP:表達式,支持更復雜的查詢情況
例如:
$map['id'] = array('in','1,3,8'); 可以改成:
$map['id'] = array('exp',' IN (1,3,8) '); exp查詢的條件不會被當成字符串,所以后面的查詢條件可以使用任何SQL支持的語法,包括使用函數和字段名稱。查詢表達式不僅可用于查詢條件,也可以用于數據更新,例如:
$User = M("User"); // 實例化User對象
// 要修改的數據對象屬性賦值
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用戶的積分加1
$User->where('id=5')->save($data); // 根據條件保存修改的數據 1
快捷查詢新版增加了快捷查詢方式,可以進一步簡化查詢條件的寫法,例如:$User = M("User"); // 實例化User對象
$map['name|title'] = 'thinkphp';
// 把查詢條件傳入查詢方法
$User->where($map)->select(); 查詢條件就變成 name= 'thinkphp' OR title = 'thinkphp'
二、實現不同字段不同的查詢條件
$User = M("User"); // 實例化User對象
$map['status&title'] =array('1','thinkphp','_multi'=>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'
注意:快捷查詢方式中“|”和“&”不能同時使用。 2
$map['id'] = array(array('gt',1),array('lt',10)) ; 得到的查詢條件是: (`id` > 1) AND (`id` < 10)
$map['id'] = array(array('gt',3),array('lt',10), 'or') ; 得到的查詢條件是: (`id` > 3) OR (`id` < 10)
$map['id'] = array(array('neq',6),array('gt',3),'and'); 得到的查詢條件是:(`id` != 6) AND (`id` > 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') 2
組合查詢如果你需要在查詢的時候同時偶爾使用字符串卻又不希望丟失數組方式的靈活的話,可以考慮使用組合查詢。$User = M("User"); // 實例化User對象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select(); 最后得到的查詢條件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
二、請求字符串查詢方式
請求字符串查詢是一種類似于URL傳參的方式,可以支持簡單的條件相等判斷。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or'; 得到的查詢條件是:`id`>100 AND (`status` = '1' OR `score` = '100')
三、復合查詢
復合查詢相當于封裝了一個新的查詢條件,然后并入原來的查詢條件之中,所以可以完成比較復雜的查詢條件組裝。
例如:
$where['name'] = array('like', '%thinkphp%');
$where['title'] = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id'] = array('gt',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語句是一致的。 3
統計查詢在應用中我們經常會用到一些統計數據,例如當前所有(或者滿足某些條件)的用戶數、所有用戶的最大積分、用戶的平均成績等等,ThinkPHP為這些統計操作提供了一系列的內置方法,包括:方法 | 說明 |
---|---|
$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'); 并且所有的統計查詢均支持連貫操作的使用。
定位查詢ThinkPHP支持定位查詢,但是要求當前模型必須繼承高級模型類才能使用,可以使用getN方法直接返回查詢結果中的某個位置的記錄。例如:$User->where('score>0')->order('score desc')->getN(2); 獲取符合條件的最后第二條記錄:
$User-> where('score>80')->order('score desc')->getN(-2); 獲取第一條記錄:
$User->where('score>80')->order('score desc')->first(); 獲取最后一條記錄:
$User->where('score>80')->order('score desc')->last();
SQL查詢ThinkPHP內置的ORM和ActiveRecord模式實現了方便的數據存取操作,而且新版增加的連貫操作功能更是讓這個數據操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查詢和執行操作支持,為了滿足復雜查詢的需要和一些特殊的數據操作,SQL查詢的返回值因為是直接返回的Db類的查詢結果,沒有做任何的處理。主要包括下面兩個方法:query 執行SQL查詢操作 | |
---|---|
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->query("select * from think_user where status=1"); 如果你當前采用了分布式數據庫,并且設置了讀寫分離的話,query方法始終是在讀服務器執行,因此query方法對應的都是讀操作,而不管你的SQL語句是什么。 2、execute方法
execute用于更新和寫入數據的sql操作 | |
---|---|
$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->execute("update think_user set name='thinkPHP' where status=1"); 如果你當前采用了分布式數據庫,并且設置了讀寫分離的話,execute方法始終是在寫服務器執行,因此execute方法對應的都是寫操作,而不管你的SQL語句是什么。 3、其他技巧
自動獲取當前表名
通常使用原生SQL需要手動加上當前要查詢的表名,如果你的表名以后會變化的話,那么就需要修改每個原生SQL查詢的sql語句了,針對這個情況,系統還提供了一個小的技巧來幫助解決這個問題。
例如:
$model = M("User");
$model->query('select * from __TABLE__ where status>1'); 我們這里使用了__TABLE__ 這樣一個字符串,系統在解析的時候會自動替換成當前模型對應的表名,這樣就可以做到即使模型對應的表名有所變化,仍然不用修改原生的sql語句。
支持連貫操作和SQL解析
新版對query和execute兩個原生SQL操作方法增加第二個參數支持, 表示是否需要解析SQL (默認為false 表示直接執行sql ),如果設為true 則會解析SQL中的特殊字符串 (需要配合連貫操作)。
例如,支持 如下寫法:
$model->table("think_user")
->where(array("name"=>"thinkphp"))
->field("id,name,email")
->query('select %FIELD% from %TABLE% %WHERE%',true); 其中query方法中的%FIELD%、%TABLE%和%WHERE%字符串會自動替換為同名的連貫操作方法的解析結果SQL,支持的替換字符串包括:
替換字符串 | 對應連貫操作方法 |
---|---|
方法名 | 說明 | 舉例 |
---|---|---|
$user = $User->getByName('liu21st');
$user = $User->getByEmail('[email protected]');
$user = $User->getByAddress('中國深圳'); 暫時不支持多數據字段的動態查詢方法,請使用find方法和select方法進行查詢。 二、getFieldBy動態查詢
針對某個字段查詢并返回某個字段的值,例如
$user = $User->getFieldByName('liu21st','id'); 表示根據用戶的name獲取用戶的id值。 三、top動態查詢
ThinkPHP還提供了另外一種動態查詢方式,就是獲取符合條件的前N條記錄(和定位查詢一樣,也要求當前模型類必須繼承高級模型類后才能使用)。例如,我們需要獲取當前用戶中積分大于0,積分最高的前5位用戶 :
$User-> where('score>80')->order('score desc')->top5(); 要獲取積分的前8位可以改成:
$User-> where('score>80')->order('score desc')->top8(); 5
子查詢新版新增了子查詢支持,有兩種使用方式:// 首先構造子查詢SQL
$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->select(false); 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可用于TP的連貫操作方法,例如table where等。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答