1 數據庫查詢
ThinkPHP內置了非常靈活的查詢方法,可以快速的進行數據查詢操作。
查詢條件可以用於CURD等任何操作,作為where方法的參數傳入即可。
1.1 ThinkPHP可以支持直接使用字符串作為查詢條件,但是大多數情況推薦使用索引數組或者對象來作為查詢條件,因為會更加安全。
查詢方式
這是最傳統的方式,但是安全性不高,例如:
- $User = M("User"); // 實例化User對象
- $User->where('type=1 AND status=1')->select();
SELECT * FROM think_user WHERE type=1 AND status=1
- $User = M("User"); // 實例化User對象
- $condition['name'] = 'thinkphp';
- $condition['status'] = 1;
- // 把查詢條件傳入查詢方法
- $User->where($condition)->select();
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();
SELECT * FROM think_user WHERE ' name'='thinkphp' OR `account`='thinkphp'
- $User = M("User"); // 實例化User對象
- // 定義查詢條件
- $condition = new stdClass();
- $condition->name = 'thinkphp';
- $condition->status= 1;
- $User->where($condition)->select();
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
使用對象方式查詢和使用數組查詢的效果是相同的,並且是可以互換的,大多數情況下,我們 建議采用數組方式更加高效,后面我們會以數組方式為例來講解具體的查詢語言用法。
1.2表達式查詢
上面的查詢條件僅僅是一個簡單的相等判斷,可以使用查詢表達式支持更多的SQL查詢語法,並且可以用於數組或者對象方式的查詢(下面僅以數組方式為例說明),查詢表達式的使用格式:
$map['字段名'] = array('表達式','查詢條件');
表達式不分大小寫,支持的查詢表達式有下面幾種,分別表示的含義是:
| 表達式 | 含義 |
|---|---|
| EQ | 等於(=) |
| NEQ | 不等於(<>) |
| GT | 大於(>) |
| EGT | 大於等於(>=) |
| LT | 小於(<) |
| ELT | 小於等於(<=) |
| LIKE | 模糊查詢 |
| [NOT] BETWEEN | (不在)區間查詢 |
| [NOT] IN | (不在)IN 查詢 |
| EXP | 表達式查詢,支持SQL語法 |
$map['id'] = array('eq',100); id = 100; $map['id'] = array('egt',100);id >= 100 $map['name'] = array('like','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')
2、連貫操作
ThinkPHP模型基礎類提供的連貫操作方法,可以有效的提高數據存取的代碼清晰度和開發效率,並且支持所有的CURD操作。使用也比較簡單, 假如我們現在要查詢一個User表的滿足狀態為1的前10條記錄,並希望按照用戶的創建時間排序 ,代碼如下:
- $User->where('status=1')->order('create_time')->limit(10)->select();
這里的where、order和limit方法就被稱之為連貫操作方法,除了select方法必須放到最后一個外(因為select方法並不是連貫操作方法),連貫操作的方法調用順序沒有先后,例如,下面的代碼和上面的等效:
- $User->order('create_time')->limit(10)->where('status=1')->select();
如果不習慣使用連貫操作的話,還支持直接使用參數進行查詢的方式。例如上面的代碼可以改寫為:
- $User->select(array('order'=>'create_time','where'=>'status=1','limit'=>'10'));
使用數組參數方式的話,索引的名稱就是連貫操作的方法名稱。其實T不僅僅是查詢方法可以使用連貫操作,包括所有的CURD方法都可以使用,例如:
- $User->where('id=1')->field('id,name,email')->find();
- $User->where('status=1 and id=1')->delete();
連貫操作通常只有一個參數,並且僅在當此查詢或者操作有效,完成后會自動清空連貫操作的所有傳值(有個別特殊的連貫操作有多個參數,並且會記錄當前的傳值)。簡而言之,連貫操作的結果不會帶入以后的查詢。
系統支持的連貫操作方法有:
| 連貫操作 | 作用 | 支持的參數類型 |
|---|---|---|
| where | 用於查詢或者更新條件的定義 | 字符串、數組和對象 |
| table | 用於定義要操作的數據表名稱 | 字符串和數組 |
| alias | 用於給當前數據表定義別名 | 字符串 |
| data | 用於新增或者更新數據之前的數據對象賦值 | 數組和對象 |
| field | 用於定義要查詢的字段(支持字段排除) | 字符串和數組 |
| order | 用於對結果排序 | 字符串和數組 |
| limit | 用於限制查詢結果數量 | 字符串和數字 |
| page | 用於查詢分頁(內部會轉換成limit) | 字符串和數字 |
| group | 用於對查詢的group支持 | 字符串 |
| having | 用於對查詢的having支持 | 字符串 |
| join* | 用於對查詢的join支持 | 字符串和數組 |
| union* | 用於對查詢的union支持 | 字符串、數組和對象 |
| distinct | 用於查詢的distinct支持 | 布爾值 |
| lock | 用於數據庫的鎖機制 | 布爾值 |
| cache | 用於查詢緩存 | 支持多個參數 |
| relation | 用於關聯查詢(需要關聯模型支持) | 字符串 |
所有的連貫操作都返回當前的模型實例對象(this),其中帶*標識的表示支持多次調用。
2.1 limit操作
在ThinkPHP的用法里面始終是limit('offset,length') ,無論是Mysql、SqlServer還是Oracle數據庫,都是這樣使用,系統的數據庫驅動類會負責解決這個差異化。
使用示例:
- limit('1,10')
如果使用limit('10') 等效於 limit('0,10')
3.1版本以后,limit方法增加第二個參數支持,例如:
- $this->limit(10,100)->select();
和之前的用法
- $this->limit('10,100')->select();
等效。
