一:字符串條件查詢
//直接實例化Model $user=M('user1'); var_dump($user->where ('id=1 OR age=55')->select());
最終生成的sql語句為:SELECT * FROM `user1` WHERE ( id=1 OR age=55 )
PS:where 查詢方法里面只要包含條件即可,多個條件加上 AND 等連接符即可
二:使用索引數組作為查詢條件
$user=M('user1'); $condition['age']='55'; $condition['name']='zs'; // 索引數組查詢的默認邏輯關系是 AND,如果想改變為 OR,可以使用_logic 定義查詢邏輯 $condition['_logic'] = 'OR'; var_dump($user->where($condition)->select());
最終生成的sql語句為:SELECT * FROM `user1` WHERE `id` = ‘1’ AND `name` = 'zs'
三:使用對象方式查詢
<?php namespace Home\Controller; use Think\Controller; use Think\stdClass; class EleController extends Controller { $user=M('user1'); $condition=new \stdClass; $condition->id = '1'; var_dump($user->where($condition)->select()); }
最終生成的sql語句為:SELECT * FROM `user1` WHERE `id` = ‘1’
四:表達式查詢
查詢表達式格式:$map['字段名'] = array('表達式','查詢條件');
$user=M('user1'); $map['age'] = array('eq', 55); //where 為 age=55 var_dump($user->where($map)->select());
五:快捷查詢
//使用相同查詢條件 $user = M('user1'); $map['name|email'] = 'a'; //'|'換成'&'變成AND var_dump($user->where($map)->select()); // 不同字段不同查詢條件 //使用不同查詢條件 $user = M('user1'); $map['name&email'] =array('a','test@qq.com','_multi'=>true); var_dump($user->where($map)->select());
第一條查詢的結果:SELECT * FROM `user1` WHERE ( `name` = 'a' OR `email` = 'a' )
第二條查詢的結果:SELECT * FROM `user1` WHERE ( (`name` = 'a') AND (`email` = 'test@qq.com') )
六:區間查詢
// 區間查詢 $user = M('user1'); $map['id'] = array(array('gt', 1), array('lt', 4)); var_dump($user->where($map)->select()); //第三個參數設置邏輯OR $user = M('User1'); $map['id'] = array(array('gt', 1), array('lt', 4), 'OR'); var_dump($user->where($map)->select() }
七:組合查詢
組合查詢是基於索引數組查詢方式的一個擴展性查詢,添加了字符串查詢(_string)、復合查詢(_complex)、請求字符串查詢(_query),由於采用的是索引數組,重復的會被覆蓋。
//字符串查詢(_string) $user = M('user1'); $map['name'] = array('eq', 'zs'); $map['_string'] ='age="30" AND email="zs@qq.com"'; var_dump($user->where($map)->select()); //請求字符串查詢(_query) $user = M('user1'); $map['id'] = array('eq', "1"); $map['_query'] ='name=zs&email=zs@qq.com&_logic=OR'; var_dump($user->where($map)->select()); //復合查詢(_complex) $user = M('user1'); $where['name'] = array('like', 'z'); $where['id'] = 1; $where['_logic'] = 'OR'; $map['_complex'] = $where; $map['id'] = 3; $map['_logic'] = 'OR'; var_dump($user->where($map)->select());
第一條查詢語句:SELECT * FROM `user1` WHERE `name` = 'zs' AND ( age="30" AND email="zs@qq.com" )
第二條查詢語句:SELECT * FROM `user1` WHERE `name` = 'zs' AND ( age="30" AND email="zs@qq.com" ) AND ( `name` = 'zs' OR `email` = 'zs@qq.com' )
第三條查詢語句:SELECT * FROM `user1` WHERE `name` = 'zs' OR ( age="30" AND email="zs@qq.com" ) OR ( `name` = 'zs' OR `email` = 'zs@qq.com' ) OR ( `name` LIKE 'z' OR `id` = 1 )
八:統計查詢
//數據總條數 //SHOW COLUMNS FROM `user1` $user = M('user1'); var_dump($user->count()); //字段總條數,遇到NULL不統計 //SELECT COUNT(*) AS tp_count FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->count('email')); //最大值 //SELECT MAX(id) AS tp_max FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->max('id')); //最小值 //SELECT MIN(id) AS tp_min FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->min('id')); //平均值 //SELECT AVG(id) AS tp_avg FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->avg('id')); //求總和 //SELECT SUM(id) AS tp_sum FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->sum('id'));
九:動態查詢
// 1.getBy 動態查詢 //查找email=xiaoin@163.com的數據 //SELECT * FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->getByemail('zs@qq.com')); // 2.getFieldBy 動態查詢 //通過user得到相對應id值 //SELECT `id` FROM `user1` LIMIT 1 $user = M('user1'); var_dump($user->getFieldByUser('ls', 'id'));
十:SQL查詢
// 1.query 讀取 //查詢結果集,如果采用分布式讀寫分離,則始終在讀服務器執行 //SELECT * FROM user1 $user = M('user1'); var_dump($user->query('SELECT * FROM user1')); // 2.execute寫入 //更新和寫入,如果采用分布式讀寫分離,則始終在寫服務器執行 //UPDATE user1 set name="xuexi" WHERE id="1"; $user = M('user1'); var_dump($user->execute('UPDATE user1 set name="xuexi" WHERE id="1";'));
十一:連貫查詢
通過連貫操作可以有效的提供數據存取的代碼清晰度和開發效率,並且支持所有的 CURD 操作
//連貫操作 //PS:這里的 where、order 和 limit 方法都是連貫操作方法,所以它們都能返回$user本身,可以互換位置。而 select 方法不是連貫方法,需要放在最后,用以顯示數據集。 //SELECT * FROM `user1` WHERE ( id in (1,2,3,4) ) LIMIT 2 $user=M('user1'); var_dump($user->where('id in (1,2,3,4)')->limit(2)->select()); //數組操作 //SELECT * FROM `user1` WHERE id in (1,2,3,4) LIMIT 2 $user = M('user1'); var_dump($user->select(array('where'=>'id in (1,2,3,4)', 'limit'=>'2', ))); // CURD處理 // SELECT * FROM `user1` WHERE ( id=1 ) LIMIT 1 // DELETE FROM `user1` WHERE ( id=2 ) $user = M('user1'); var_dump($user->where('id=1')->find()); var_dump($user->where('id=2')->delete());
1.where(支持字符串條件、數組條件(推薦用法)和多次調用。)
//字符串方式 //SELECT * FROM `user1` WHERE ( id=6 ) var_dump($user->where('id=6')->select()); //索引數組方式 // SELECT * FROM `user1` WHERE `id` = 6 $map['id']=6; var_dump($user->where($map)->select()); //多次調用方式 SELECT * FROM `user1` WHERE `id` = 6 AND ( name="test" ) $map['id']=array('eq',6); var_dump($user->where($map)->where('name="test"')->select());
2.order 用於對結果集排序
// 倒序 // SELECT * FROM `user1` ORDER BY id desc var_dump($user->order('id desc')->select()); // 第二排序 // SELECT * FROM `user1` ORDER BY id desc,age desc var_dump($user->order('id desc,age desc')->select()); //數組形式,防止字段和mysql關鍵字沖突 // SELECT * FROM `user1` ORDER BY `id` DESC,`email` DESC $map['id']=1; var_dump($user->order(array('id'=>'DESC','email'=>'DESC'))->select());
3.feild(feild 方法可以返回或操作字段,可以用於查詢和寫入操作。)
// 只顯示id和name兩個字段 // SELECT `id`,`name` FROM `user1` var_dump($user->field('id,name')->select()); //使用SQL函數和別名 // SELECT SUM(id) as count,`name` FROM `user1` var_dump($user->field('SUM(id) as count,name')->select()); // 使用數組參數結合SQL函數 // SELECT `id`,LEFT(name,1) AS `left_user` FROM `user1` var_dump($user->field(array('id','LEFT(name,1)'=>'left_user'))->select()); //獲取所有字段 // SELECT * FROM `user1` var_dump($user->field()->select()); //用於寫入 $user->field('name,email')->create();
4.limit(主要用於指定查詢和操作的數量)
//限制結果集數量 // SELECT * FROM `user1` LIMIT 2 var_dump($user->limit(2)->select()); //分頁查詢 // SELECT * FROM `user1` LIMIT 1,2 var_dump($user->limit(1,2)->select());
5.page(page 方法完全用於分頁查詢)
//page分頁 // SELECT * FROM `user1` LIMIT 3,3 var_dump($user->page(2,3)->select());
6.table(用於數據表操作,主要是切換數據表或多表操作)
//切換數據表 // SELECT * FROM `test_user` var_dump($user->table('test_user')->select());
7.alias (用於設置數據表別名)
// 設置別名 // SELECT * FROM user1 a var_dump($user->alias('a')->select());
8.group(用於對結合函數統計的結果集分組)
// 分組統計 // SELECT `name`,max(id) FROM `user1` GROUP BY id var_dump($user->field('name,max(id)')->group('id')->select());
9.having(用於配合 group 方法完成從分組的結果中再篩選數據)
//分組統計結合having // SELECT `user`,max(id) FROM `user1` GROUP BY id HAVING id>2 var_dump($user->field('user,max(id)')->group('id')->having('id>2')->select());
10.comment (用於對 SQL 語句進行注釋)
//SQL注釋 // SELECT * FROM `user1` /* test */ var_dump($user->comment('test')->select());
命名空間
命名范圍其實就是將 SQL 語句封裝在模型定義類里,而不在控制器里。
在Model下新建一個User1Model.class.php文件
<?php namespace Home\Model; use Think\Model; class User1Model extends Model { //定義屬性 protected $_scope = array( //屬性名必須是_scope 'sql1'=>array( 'where'=>array('id'=>1), ), 'sql2'=>array( 'order'=>'date DESC', 'limit'=>2, ), 'default'=>array( 'where'=>array('id'=>2), ), ); }
命名范圍支持的屬性有:where、field、order、table、limit、page、having、group、lock、distinct、cache
在Controller目錄下新建一個User1Controller.class.php文件
<?php namespace Home\Controller; use Think\Controller; use Home\Model\User1Model; class User1Controller extends Controller { public function model(){ // ps:一定要填入表名,user1 // 他會先去model文件夾找有沒有user1model // 如果有就應用 // 如果沒有,會直接引用model基類 $user=D('user1'); // sql語句:SELECT * FROM `user1` WHERE `id` = 1 var_dump($user->scope('sql1')->select()); } }