thinkPHP常用數據操作(二)查詢語言

上一節講了使用 activerecord(AR)模式操作數據,但是面對複雜的業務邏輯時,AR模式很難應對,因此本節tp提供更加靈活的查詢方式。

1 使用字符串作爲查詢條件(安全性不高)

$User = M("User"); // 實例化User對象
$User->where('type=1 AND status=1')->select();

//生成 SELECT * FROM think_user WHERE type=1 AND status=1

(注:可以配合tp提供的字符串條件的安全預處理機制)

2 使用數組作爲查詢條件(最常用的方式)

$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'

3 //對象方式由於效率不高,略過

4 表達式查詢

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

//支持列表如下

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

//例如 

$map['name'] = array('like','thinkphp%');

$map['id'] = array('between',array('1','8'));//支持字符串或者數組

$map['id'] = array('not in',array('1','5','8'));//支持字符串或者數組

//exp查詢的條件不會被當成字符串,所以後面的查詢條件可以使用任何SQL支持的語法.例如

$User = M("User"); /
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用戶的積分加1
$User->where('id=5')->save($data); // 根據條件保存修改的數據

5快捷查詢

(1)實現不同字段相同的查詢條件

$User = M("User"); // 實例化User對象
$map['name|title'] = 'thinkphp';
// 把查詢條件傳入查詢方法
$User->where($map)->select();

//name= 'thinkphp' OR title = 'thinkphp'

(2)實現不同字段不的查詢條件

$User = M("User"); // 實例化User對象
$map['status&title'] =array('1','thinkphp','_multi'=>true);//'_multi'=>true必須加在數組的最後
// 把查詢條件傳入查詢方法
$User->where($map)->select();

//這種方式也支持更多字段,如

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

6區間查詢

$map['id'] = array(array('gt',1),array('lt',10)) ;//默認and連接

$map['id'] = array(array('gt',3),array('lt',10), 'or') ;

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

7組合查詢

(1)字符串模式查

$User = M("User"); // 實例化User對象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();

(2)請求字符串查詢方式

$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';//類似於URL傳參的方式,可以支持簡單的條件相等判

(3)複合查詢

$where['name'] = array('like', '%thinkphp%');
$where['title'] = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id'] = array('gt',1);

//上述查詢方式轉換爲字符串查詢爲

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

7統計查詢

//方法說明
//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');

8SQL查詢

//ThinkPHP內置的ORM和ActiveRecord模式實現了方便的數據存取操作,而且新版增加的連貫操作功能更
//是讓這個數據操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查詢和執行操作支持,爲了滿足複雜查
詢的需要和一些特殊的數據操作,SQL查詢的返回值因爲是直接返回的Db類的查詢結果,沒有做任何的處

(1)query方法 

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

$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->query("select * from think_user where status=1");

(2)execute方法 

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

$Model = new Model() // 實例化一個model對象 沒有對應任何數據表
$Model->execute("update think_user set name='thinkPHP' where status=1");

9 動態查詢 .感覺用處較少,此處略過

10 子查詢(尚未熟練使用)

(1)使用select方法

//當select方法的參數爲false的時候,表示不進行查詢只是返回構建SQL

$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('s
tatus')->select(false);

(2)使用buildSql方法

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

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

select(false)與buildSql(),相當於優先構建出一條select的子查詢,然後相當於把結果集AS給a表,如table($subQuery.'a'),然後再對a表執行select count(*) from a,完成子查詢的處理

以上內容大部分摘自 thinkphp3.2.3快速入門,詳情請參考官方手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章