thinkphp-數據庫操作


1 數據庫查詢

ThinkPHP內置了非常靈活的查詢方法,可以快速的進行數據查詢操作。

查詢條件可以用於CURD等任何操作,作為where方法的參數傳入即可

1.1 ThinkPHP可以支持直接使用字符串作為查詢條件,但是大多數情況推薦使用索引數組或者對象來作為查詢條件,因為會更加安全。

查詢方式

一、使用字符串作為查詢條件
這是最傳統的方式,但是安全性不高,例如:
  1. $User = M("User"); // 實例化User對象
  2. $User->where('type=1 AND status=1')->select(); 
最后生成的SQL語句是
SELECT * FROM think_user WHERE type=1 AND status=1
二、使用數組作為查詢條件
  1. $User = M("User"); // 實例化User對象
  2. $condition['name'] = 'thinkphp';
  3. $condition['status'] = 1;
  4.  // 把查詢條件傳入查詢方法
  5. $User->where($condition)->select(); 
最后生成的SQL語句是
SELECT * FROM think_user WHERE 'name'='thinkphp' AND status=1
如果進行多字段查詢,那么字段之間的默認邏輯關系是 邏輯 與 AND,但是用下面的規則可以更改默認的邏輯判斷,通過使用 _logic 定義查詢邏輯
  1. $User = M("User"); // 實例化User對象
  2. $condition['name'] = 'thinkphp';
  3. $condition['account'] = 'thinkphp';
  4. $condition['_logic'] = 'OR'; //定義查詢邏輯
  5.  // 把查詢條件傳入查詢方法
  6. $User->where($condition)->select(); 
最后生成的SQL語句是
SELECT * FROM think_user WHERE ' name'='thinkphp' OR `account`='thinkphp'
 
三、使用對象方式來查詢 (這里以stdClass內置對象為例)
  1. $User = M("User"); // 實例化User對象
  2.  // 定義查詢條件
  3. $condition = new stdClass(); 
  4. $condition->name = 'thinkphp'; 
  5. $condition->status= 1; 
  6. $User->where($condition)->select(); 
最后生成的SQL語句和上面一樣
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條記錄,並希望按照用戶的創建時間排序 ,代碼如下:

  1. $User->where('status=1')->order('create_time')->limit(10)->select();

這里的where、order和limit方法就被稱之為連貫操作方法,除了select方法必須放到最后一個外(因為select方法並不是連貫操作方法),連貫操作的方法調用順序沒有先后,例如,下面的代碼和上面的等效:

  1. $User->order('create_time')->limit(10)->where('status=1')->select();

如果不習慣使用連貫操作的話,還支持直接使用參數進行查詢的方式。例如上面的代碼可以改寫為:

  1. $User->select(array('order'=>'create_time','where'=>'status=1','limit'=>'10'));

使用數組參數方式的話,索引的名稱就是連貫操作的方法名稱。其實T不僅僅是查詢方法可以使用連貫操作,包括所有的CURD方法都可以使用,例如:

  1. $User->where('id=1')->field('id,name,email')->find(); 
  2. $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數據庫,都是這樣使用,系統的數據庫驅動類會負責解決這個差異化。
使用示例:

  1. limit('1,10')

如果使用limit('10') 等效於 limit('0,10')

3.1版本以后,limit方法增加第二個參數支持,例如:

  1. $this->limit(10,100)->select();

和之前的用法

  1. $this->limit('10,100')->select();

等效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM