首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 3.1 查詢語言詳解:從基礎到組合/子查詢的完整指南

     編輯:PHP 相關知識

查詢條件三種形式

  • 字串:where('type=1 AND status=1'),傳統但不安全,需配合預處理。
  • 索引陣列(推薦):where(array('name'=>'thinkphp','status'=>1)),自動轉義、預處理。
  • 對象:where((object)array('name'=>'thinkphp')),效果同陣列。

表達式查詢(精髓)

格式:$map['字段'] = array('表達式','條件');

表達式含義示例
EQ=array('eq',100) ≡ 100
NEQ<>array('neq',100)
GT/EGT> / >=array('gt',100) / array('egt',100)
LT/ELT< / <=array('lt',100) / array('elt',100)
LIKE模糊array('like','thinkphp%');配合 DB_LIKE_FIELDS 自動模糊
[NOT] BETWEEN區間array('between','1,8') 或 array('between',array(1,8))
[NOT] IN集合array('in','1,5,8') 或 array('in',array(1,5,8))
EXP原生 SQL 片段array('exp','IN (1,3,8)');也可用於更新 array('exp','score+1')

快捷查詢

  • $map['name|title']='thinkphp' → name='thinkphp' OR title='thinkphp'
  • $map['status&title']=array(1,'thinkphp','_multi'=>true) → status=1 AND title='thinkphp'
    _multi=>true 必須置陣列末尾。| 與 & 不可混用。

區間查詢(同字段多條件)

$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['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP', 'or');

最後一參數為邏輯運算符(AND/OR/XOR),預設 AND。

組合查詢(特殊鍵名)

  • _string:混合字串條件 $map['_string']='status=1 AND score>10'
  • _query:URL 參數風格 $map['_query']='status=1&score=100&_logic=or'
  • _complex:封裝子查詢條件 $map['_complex']=$where,支援嵌套邏輯。

統計查詢

方法說明
count('字段')統計數量,字段可選
max('字段')最大值,字段必填
min('字段')最小值,字段必填
avg('字段')平均值,字段必填
sum('字段')總和,字段必填

均支援鏈式操作:$User->where('score>0')->max('score')。

原生 SQL 查詢

  • query($sql,$parse=false):讀操作(走讀庫),返回結果集。
  • execute($sql,$parse=false):寫操作(走寫庫),返回影響行數。
  • 分布式讀寫分離下自動路由,無視 SQL 類型。

動態查詢

  • getBy字段名(值):$User->getByName('liu21st')
  • getFieldBy字段名(值,目標字段):$User->getFieldByName('liu21st','id')

子查詢

// 方式 1:select(false)
$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();

// 使用
$model->table($subQuery.' a')->where(...)->order(...)->select();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved