真XX項目 TP連貫操作總結
field方法的用法
參考鏈接:CURD方法盤點:field方法
用於查詢
在查詢操作中field方法是使用最頻繁的。
eg1:$Model ->field('id,title,content') ->select();
複製代碼這裏使用field方法指定了查詢的結果集中包含id,title,content三個字段的值。執行的SQL相當於:
SELECT id,title,content FROM table可以as取別名
eg2: $Select ->field('id as role_id,role_name,role_type') ->select();
數組方式的定義可以爲某些字段定義別名
eg:$Model ->field(array('id','title'=>'name','content')) ->select();
與while()和find()查詢
M('User') ->where('id='.$userid) ->field('id as userid,user_role,follow,fans,love,head as photo,city,nickname,sex,age,message') ->find();
ps:while提供查詢條件,find只查詢一條即系統自動加上了 LIMIT 1 限制
find參考鏈接:ThinkPHP find方法 查詢一條數據記錄
表取別名 分頁 查詢
$Follow ->alias('c') //給表去別名。alias用於設置當前數據表的別名 便於使用其他的連貫操作例如join方法等。 ->join('__USER__ u ON c.c_bei= u.id') //JOIN方法是連貫操作中唯一可以多次調用的方法 ->where("c.c_zhu='{$userid}'") ->field('c.c_bei,u.id as accountid,u.sex,u.nickname,u.head as photo,u.message') ->limit($page,$number) //分頁查詢 ->select(); //返回一個二維數組的查詢結果
table多表進行操作
$Model ->table('zca_blacklist bl,zca_user user') //多表查詢並取別名 ->where("bl.user='{$userid}' AND bl.blacklister = user.id") ->field('user.id,user.nickname,user.head as photo,user.sex,user.message') ->limit($page,$number) ->select();
排序
$Photo ->field('url') ->where("album='{$albumid}'") ->order('add_time asc') ->find()['url'];
ps:order方法
用於寫入
除了查詢操作之外,field方法還有一個非常重要的安全功能–字段合法性檢測(注意:該功能3.1版本開始才能支持)。field方法結合create方法使用就可以完成表單提交的字段合法性檢測:
$Model ->field('title,email,content') ->create(); //表單中的合法字段只有title,email和content字段 無論用戶通過什麼手段更改或者添加了瀏覽器的提交字段 都會直接屏蔽
ps:create方法
where方法的用法
參考鏈接:CURD方法盤點:where方法
字符串條件
使用字符串條件直接查詢和操作
$User ->where('type=1 AND status=1') ->select();
最後生成的SQL語句是:SELECT * FROM think_user WHERE type=1 AND status=1
如果使用3.1以上版本的話,使用字符串條件的時候,建議配合預處理機制,確保更加安全
$Model ->where("id=%d and username='%s' andxx='%f'",array($id,$username,$xx)) ->select();
或者使用:
$Model ->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx) ->select();
ps:如果$id變量來自用戶提交或者URL地址的話,如果傳入的是非數字類型,則會強制格式化爲數字格式後進行查詢操作。
字符串預處理格式類型支持指定數字、字符串等,具體可以參考vsprintf方法的參數說明。參考鏈接:PHP vsprintf() 函數
數組條件
普通查詢
$User = M("User"); // 實例化User對象 $map['name'] = 'thinkphp'; $map['status'] = 1; // 把查詢條件傳入查詢方法 $User->where($map)->select();
最後生成:SELECT * FROM think_user WHERE
name
=’thinkphp’ AND status=1表達式查詢
$map['字段1'] = array('表達式','查詢條件1'); $map['字段2'] = array('表達式','查詢條件2'); $Model->where($map)->select();
表達式不分大小寫,支持的查詢表達式有下面幾種,分別表示的含義是:
表達式 含義 EQ 等於(=) NEQ 不等於(<>) GT 大於(>) EGT 大於等於(>=) LT 小於(<) ELT 小於等於(<=) LIKE 模糊查詢 [NOT] BETWEEN (不在)區間查詢 [NOT] IN (不在)IN 查詢 EXP 表達式查詢,支持SQL語法
示例如下:
EQ :等於(=)
$map['id'] = array('eq',100);
和下面的查詢等效
$map['id'] = 100;
表示的查詢條件就是 id = 100
NEQ: 不等於(<>)
$map['id'] = array('neq',100);
表示的查詢條件就是 id <> 100
GT:大於(>)
$map['id'] = array('gt',100);
表示的查詢條件就是 id > 100
EGT:大於等於(>=)
$map['id'] = array('egt',100);
表示的查詢條件就是 id >= 100
LT:小於(<)
$map['id'] = array('lt',100);
表示的查詢條件就是 id < 100
ELT: 小於等於(<=)
$map['id'] = array('elt',100);
表示的查詢條件就是 id <= 100
[NOT] LIKE: 同sql的LIKE
$map['name'] = array('like','thinkphp%');
查詢條件就變成 name like ‘thinkphp%’
如果配置了DB_LIKE_FIELDS參數的話,某些字段也會自動進行模糊查詢。
例如設置了:'DB_LIKE_FIELDS'=>'title|content'
的話,使用
$map['title'] = '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')
[NOT] BETWEEN :同sql的[not] between, 查詢條件支持字符串或者數組
例如:
$map['id'] = array('between','1,8');
和下面的等效:
$map['id'] = array('between',array('1','8'));
查詢條件就變成 id BETWEEN 1 AND 8
[NOT] IN: 同sql的[not] in ,查詢條件支持字符串或者數組
例如:$map['id'] = array('not in','1,5,8');
和下面的等效:
$map['id'] = array('not in',array('1','5','8'));
查詢條件就變成 id NOT IN (1,5, 8)
EXP:表達式,支持更復雜的查詢情況
例如:$map['id'] = array('in','1,3,8');
可以改成:
$map['id'] = array('exp',' IN (1,3,8) ');
exp查詢的條件不會被當成字符串,所以後面的查詢條件可以使用任何SQL支持的語法,包括使用函數和字段名稱。
查詢表達式不僅可用於查詢條件,也可以用於數據更新
例如:
$User = M("User"); // 實例化User對象 // 要修改的數據對象屬性賦值 $data['name'] = 'ThinkPHP'; $data['score'] = array('exp','score+1'); // 用戶的積分加1 $User ->where('id=5') ->save($data); // 根據條件保存修改的數據
快捷查詢
$User = M("User"); // 實例化User對象
$map['name|title'] = 'thinkphp';
// 把查詢條件傳入查詢方法
$User
->where($map)
->select();
查詢條件就變成
name= 'thinkphp' OR title = 'thinkphp
// 把查詢條件傳入查詢方法
->select();
‘_multi’=>true必須加在數組的最後,表示當前是多條件匹配,這樣查詢條件就變成 status= 1 AND title = ‘thinkphp’ ,查詢字段支持更多的,
例如:
$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);
查詢條件就變成
status= 1 AND score >0 AND title = 'thinkphp'
注意:快捷查詢方式中“|”和“&”不能同時使用。
區間查詢
where方法支持對某個字段的區間查詢,
例如:
AND
$map['id'] = array(array('gt',1),array('lt',10)) ;
得到的查詢條件是:
(`id` > 1) AND (`id` < 10)
OR
$map['id'] = array(array('gt',3),array('lt',10), 'or') ;
得到的查詢條件是:
(`id` > 3) OR (`id` < 10)
AND
$map['id'] = array(array('neq',6),array('gt',3),'and');
得到的查詢條件是:
(`id` != 6) AND (`id` > 3)
最後一個可以是AND、 OR或者 XOR運算符,如果不寫,默認是AND運算。
區間查詢的條件可以支持普通查詢的所有表達式,也就是說類似LIKE、GT和EXP這樣的表達式都可以支持。另外區間查詢還可以支持更多的條件,只要是針對一個字段的條件都可以寫到一起
例如:
$map['name'] =
array(array('like','%a%'),
array('like','%b%'),
array('like','%c%'),
'ThinkPHP','or');
最後的查詢條件是:
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')
組合查詢
組合查詢的主體還是採用數組方式查詢,只是加入了一些特殊的查詢支持,包括字符串模式查詢(_string)、複合查詢(_complex)、請求字符串查詢(_query),混合查詢中的特殊查詢每次查詢只能定義一個,由於採用數組的索引方式,索引相同的特殊查詢會被覆蓋。
字符串模式查詢
_string
數組條件還可以和字符串條件混合使用
例如:
$User = M("User"); // 實例化User對象 $map['id'] = array('neq',1); $map['name'] = 'ok'; $map['_string'] = 'status=1 AND score>10'; $User->where($map)->select();
最後得到的查詢條件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
請求字符串查詢方式
_query
請求字符串查詢是一種類似於URL傳參的方式,可以支持簡單的條件相等判斷。
$map['id'] = array('gt','100'); $map['_query'] = 'status=1&score=100&_logic=or';
得到的查詢條件是:
`id`>100 AND (`status` = '1' OR `score` = '100')
複合查詢
複合查詢相當於封裝了一個新的查詢條件,然後併入原來的查詢條件之中,所以可以完成比較複雜的查詢條件組裝。
_complex
例如:$where['name'] = array('like', '%thinkphp%'); $where['title'] = array('like','%thinkphp%'); $where['_logic'] = 'or'; $map['_complex'] = $where; $map['id'] = array('gt',1);
查詢條件是
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
複合查詢使用了_complex作爲子查詢條件來定義,配合之前的查詢方式,可以非常靈活的制定更加複雜的查詢條件。
很多查詢方式可以相互轉換,例如上面的查詢條件可以改成:
$where['id'] = array('gt',1); $where['_string'] = ' (name like "%thinkphp%") OR ( title like "%thinkphp") ';
最後生成的SQL語句是一致的。
多次調用
3.1.3版本開始,where方法支持多次調用,但字符串條件只能出現一次
例如:
$map['a'] = array('gt',1); $where['b'] = 1; $Model ->where($map) ->where($where) ->where('status=1') ->select();
多次的數組條件表達式會最終合併,但字符串條件則只支持一次。
where()補充
與count()統計
M('User') ->where('phone='.$phone) ->count();
- count():統計數據行數
- max():統計某個字段最大數據
- min():統計某個字段最小數據
- avg():統計某個字段平均數據
- sum():統計某個字段數據之和
參考資料:統計查詢
與find()只查詢一條
$User ->where('phone='.$data['phone']) ->find();
與setInc()字段跟新
if($User->add($data)){ M('Role') ->where("role_type") ->setInc('role_num'); }
ps:
必須配合連貫操作where一起使用$User = M("User"); // 實例化User對象 $User->where('id=5')->setInc('score',3); // 用戶的積分加3 $User->where('id=5')->setInc('score'); // 用戶的積分加1 $User->where('id=5')->setDec('score',5); // 用戶的積分減5 $User->where('id=5')->setDec('score'); // 用戶的積分減1
3.0的這setInc、setDec方法有了新的升級,在增加會員積分,和登錄次數的時候,非常中用。
與seve()更新數據
where("id='{$userid}'") ->save($data);
注意:使用 save() 方法更新數據,必須指定更新條件或者更新的數據中包含主鍵字段。
與setField()更新個別字段的值
$User ->where("id='{$userid}'") ->setField('online','0');
參考資料:setField 方法更新個別字段的值
與find()以及field()指定查詢字段
$store ->where('userid='.$userid) ->field('id,certification') ->find();
多表查詢
join
$Follow
->alias(‘c’)
->join(‘USER u ON c.c_bei= u.id’)
->where(“c.c_zhu=’{userid}’”)
->field(‘c.c_bei,u.id as accountid,u.sex,u.nickname,u.head as photo,u.message’)
->limit( page,$number)
->select();table
Model
->table(‘zca_user user,zca_ol ol’)
->where(“ol.ol_num = { live_id} AND ol.ol_man = user.id AND ol.status = ‘1’”)
->count();
1、原生查詢示例:
$Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.','.$p->listRows; $voList = $Model->query($sql);
2、join()方法示例:
$Model ->join('work ON artist.id = work.artist_id') ->join('card ON artist.card_id = card.id') ->select();
3、table()方法示例:
$list = $user ->table('user_status stats, user_profile profile') ->where('stats.id = profile.typeid') ->field('stats.id as id, stats.display as display, profile.title as title,profile.content as content') ->order('stats.id desc' )->select();
參考資料:ThinkPHP的多表查詢
用AND直接寫入條件
M('System') ->where("`userid`={$userid} AND `acceptid`={$user_author['prd_author']} AND `worksid` = {$got} AND `type`= '1'") ->count();
刪除
$Praise ->where($map) ->delete();
排序
$Photo ->field('url') ->where("album='{$albumid}'") ->order('add_time asc') ->find()['url'];
2017/1/14 22:43:24
統計查詢
在應用中我們經常會用到一些統計數據,例如當前所有(或者滿足某些條件)的用戶數、所有用戶的最大積分、學生的平均成績等等,ThinkPHP 爲這些統計操作提供了一系列的內置方法:
count():統計數據行數
max():統計某個字段最大數據
min():統計某個字段最小數據
avg():統計某個字段平均數據
sum():統計某個字段數據之和
上述統計查詢方法都是獨立的方法且支持連貫操作。
count()
count() 方法用於統計數據行數。
例子:
public function read(){ $Dao = M('User'); // 獲取用戶數: $userCount = $Dao ->count(); //SELECT COUNT(*) AS tp_count FROM user LIMIT 1 // 添加條件: $userCount2 = $Dao ->where('uid > 10') ->count(); //SELECT COUNT(*) AS tp_count FROM user WHERE uid > 10 LIMIT 1 $Model ->table('pre_user user,pre_ol ol') ->where("ol.ol_num = {$live_id} AND ol.ol_man = user.id AND ol.status = '1'") ->count(); $this->assign('userCount', $userCount); // 可以在模板中直接輸出得到的統計數據: // 共有用戶 {$userCount} 人。 $this->display(); }
max()
max() 方法用於統計某個字段最大數據。
統計用戶最大積分例子:
$maxScore = $Dao->max('score');
實際執行的 SQL 爲:
SELECT MAX(score) AS tp_max FROM user LIMIT 1
min()
min() 統計某個字段最小數據。
獲取積分大於 0 的用戶的最小積分例子:
$minScore = $Dao->where('score>0')->min('score');
實際執行的 SQL 爲:
SELECT MIN(score) AS tp_min FROM user WHERE score>0 LIMIT 1
avg()
avg() 統計某個字段平均數據。
獲取用戶的平均積分例子:
$avgScore = $Dao->avg('score');
實際執行的 SQL 爲:
SELECT AVG(score) AS tp_avg FROM user LIMIT 1
sum()
sum() 統計某個字段數據之和。
統計積分排名前 10 名用戶的積分之和:
$sumScore = $Dao->order('score DESC')->limit('10')->sum('score');
實際執行的 SQL 爲:
SELECT SUM(score) AS tp_sum FROM user ORDER BY score DESC LIMIT 10
所有的統計查詢如 select() 方法一樣。均支持連貫操作的使用,根據實際情況添加不同的查詢條件。
add方法新增數據
使用add方法新增數據到數據庫。
$User = M("User"); // 實例化User對象 $data['name'] = 'username'; $data['email'] = '[email protected]'; $User->add($data);
或者使用data方法連貫操作
$User->data($data)->add();
字符串方式
字符串方式用法如下:
$Model = M('User'); $data = 'name=zy2333&[email protected]'; $Model->data($data)->add();
參考資料:data方法
addall批量插入
add()和addAll()的區別
add()是記錄單條插入
$User = M("User"); // 實例化User對象 $data['name'] = 'ThinkPHP'; $data['email'] = '[email protected]'; $User->add($data);
addAll()是記錄批量插入
$dataList[] = array('name'=>'thinkphp','email'=>'[email protected]'); $dataList[] = array('name'=>'onethink','email'=>'[email protected]'); $User->addAll($dataList);
注意:下標爲0,否則可能失敗
mysql:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
數據量很多情況下儘量選擇批量插入而不是循環逐條插入,否則你的數據庫會吃不住掛掉。
不過如果你想當然的將所有數據全部存入一個數組並進行addAll也同樣會面臨掛掉的情況,這是爲什麼呢?
原因就是mysql中max_allowed_packet變量的配置限制了上傳sql語句的長度,在mysql配置中將他配置大一點就行了max_allowed_packet = 100M
同時在插入數據時也做好批量插入的長度限制,畢竟你不知道什麼時候數據會變成百萬級別的。
-addAll實例
//上傳相冊圖片 (多) public function prd_photo() { $upload = new \Think\Upload();// 實例化上傳類 $upload->maxSize = 3145728 ;// 設置附件上傳大小 $upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型 $upload->savePath = './Public/Uploads/'; // 設置附件上傳目錄// 上傳文件 $info = $upload->upload(); if(!$upload->rootPath){ mkdir($upload->rootPath,0777,true); } if(!$info) { $rest['status'] = false; $rest['message'] = '上傳失敗'; $rest['error'] = $this->error($upload->getError()); echo json_encode($rest,JSON_UNESCAPED_UNICODE);exit; }else{ $dataList = []; foreach($info as $file){ $dataList[] = [ 'author' => $_REQUEST['userid'], 'album' => $_REQUEST['album'], 'url' => '/Uploads/photo/'.$file['savepath'].$file['savename'], 'add_time' => time(), ]; } $Photo=M('Photo'); $Arr = $Photo->addAll($dataList); if($Arr){ $rest['status'] = true; $rest['message'] = '上傳成功'; echo json_encode($rest,JSON_UNESCAPED_UNICODE);exit; } } }
addAll方法中不能出現null值,否則其他數據會自動向前移動,導致添加失敗。舉例:
[ { "appId": 1, "serviceId": 2, "createUser":null, "status": 1, "priority": 2 } ]
其中,createUser字段爲null,插入時的sql語句會變成insert into va_problem (appId, serviceId, createUser, status, priority)values (1, 2, 1, 2)。null值沒了,導致插入失敗,這應該是ThinkPHP3.2.3的一個bug。
參考資料小心使用ThinkPHP中的addAll方法,關於addAll()失敗的問題
更新數據 save方法
使用 save() 方法來更新數據庫
$User->where("id='{$userid}'")->save($data);
提示:
爲了保證數據庫的安全,避免出錯更新整個數據表,如果沒有任何更新條件,數據對象本身也不包含主鍵字段的話,save方法不會更新任何數據庫的記錄。
因此要使用 save() 方法更新數據,必須指定更新條件或者更新的數據中包含主鍵字段。
如果是表單數據,還可以使用 create() 方法創建數據對象來更新數據:
public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = D("User"); if($vo = $Dao->create()) { $result = $Dao->save(); if($result !== false){ echo '數據更新成功!'; }else{ echo '數據更新失敗!'; } }else{ $this->error($Form->getError()); } }
參考資料:create()方法
create()方法
create() 創建數據對象後,將自動收集提交過來的表單數據。而表單數據可能需要經過一定加工(例如將密碼加密)才能寫入數據表,所以可以對數據對象的成員屬性值根據進行修改或添加去除等。
提示:
create() 創建的數據對象存放於內存,在執行入庫動作(add() 或 save())之前,都可以進行修改。
在上面的例子裏,create()方法 的行爲和 date()方法 是一致。但 date() 方法只是簡單的創建數據對象,但 create() 方法還具備:步驟 說明 返回 1 獲取數據源(默認是POST數組) 2 驗證數據源合法性(非數組或者對象會過濾) 失敗則返回false 3 檢查字段映射 4 判斷提交狀態(新增或者編輯 根據主鍵自動判斷) 5 數據自動驗證 失敗則返回false 6 表單令牌驗證 失敗則返回false 7 表單數據賦值(過濾非法字段和字符串處理) 8 數據自動完成 9 生成數據對象(保存在內存) 在執行入庫動作(add() 或 save())之前,進行修改
User=M(‘User′); User->create(); //創建User數據對象
User−>status=1;//設置默認的用戶狀態 User->create_time = time(); // 設置用戶的創建時間
$User->add(); // 把用戶對象寫入數據庫自動驗證與自動填充
在將表單寫入數據表之前,常常會有一些對數據的檢測(提交的用戶名是否符合要求)與處理(如例子中的密碼加密以及取得當前時間戳)。create() 方法就支持數據的自動驗證與自動完成。
在 LibModel 目錄下創建 UserModel.class.php 文件(User 爲創建的模型對象,也對應 前綴_user 表),加入自動驗證和自動填充規則:
class UserModel extends Model{ // 自動驗證設置 protected $_validate = array( array('username','require','用戶名必須填寫!',1), array('email','email','郵箱格式錯誤!',2), array('username','','用戶名已經存在!',0,'unique',1), ); //自動填充設置 protected $_auto = array( array('regdate','time',self::MODEL_INSERT,'function'), array('password','md5',self::MODEL_INSERT,'function'), ); }
將 insert2 操作更改爲:
public function insert2(){ header("Content-Type:text/html; charset=utf-8"); $Dao = D("User"); if($Dao->create()){ if($lastInsId = $Dao->add()){ echo "插入數據 id 爲:$lastInsId"; } else { echo "數據寫入錯誤!"; } }else{ exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]'); } }
如果提交的數據不符合驗證要求(如用戶名存在),則 create() 創建數據對象失敗(返回 FALSE ),$Dao->getError() 會打印出自動驗證設置規則裏面設置的提示信息:用戶名已經存在!
如果驗證規則通過後,系統會進行自動填充設置,將表單密碼進行 MD5 加密以及取得當前的時間戳填充入 create() 的數據對象。
所以 D方法 配合 create() 是非常智能而強大的,恰當運用可以達到事半功倍快速開發的目的。提示
D 方法配合 create() 由於其功能強大,也就損失了一定的效率,在業務邏輯不復雜的情況下推薦 M方法+data() 模式
create() 默認接受 POST 數據,若要接受其他類型數據,只需在參數內指定即可,如接受 GET 數據:create($_GET)create方法如果沒有傳值,默認取$_POST數據,如果用戶提交的變量內容,含有可執行的html代碼,請進行手工過濾。
$_POST['title'] = "<script>alert(1);</script>";
非法html代碼可以使用htmlspecialchars進行編碼,以防止用戶提交的html代碼在展示時被執行,以下是兩種安全處理方法。
$_POST['title'] = htmlspecialchars($_POST['title']); M('User')->create(); $data['title'] = $this->_post('title', 'htmlspecialchars'); M('User')->create($data);
參考資料:create()方法創建數據,表單數據智能寫入 create 方法,ThinkPHP3.1快速入門(16)安全
data方法
寫操作
通常情況下我們都是通過create方法或者賦值的方式生成數據對象,然後寫入數據庫,例如:
$Model = D('User'); $Model->create(); // 這裏略過具體的自動生成和驗證判斷 $Model->add();
又或者直接對數據對象賦值,例如:
$Model = M('User'); $Model->name = 'zy'; $Model->email = '[email protected]'; $Model->add();
那麼data方法則是直接生成要操作的數據對象,例如:
$Model = M('User'); $data['name'] = 'zy'; $data['email'] = '[email protected]'; $Model->data($data)->add();
注意:如果我們同時使用create方法和data創建數據對象的話,則後調用的方法有效。
data方法支持數組、對象和字符串,對象方式如下:
$Model = M('User'); $obj = new stdClass; $obj->name = 'zy'; $obj->email = '[email protected]'; $Model->data($obj)->add();
字符串方式用法如下:
$Model = M('User'); $data = 'name=zy&[email protected]'; $Model->data($data)->add();
也可以直接在add方法中傳入數據對象來新增數據,例如:
$Model = M('User'); $data['name'] = 'zy'; $data['email'] = '[email protected]'; $Model->add($data);
但是這種方式data參數只能使用數組。
當然data方法也可以用於更新數據,例如:
$Model = M('User'); $data['id'] = 8; $data['name'] = 'zy'; $data['email'] = '[email protected]'; $Model->data($data)->save();
當然我們也可以直接這樣用:
$Model = M('User'); $data['id'] = 8; $data['name'] = 'zy'; $data['email'] = '[email protected]'; $Model->save($data);
同樣,此時data參數只能傳入數組。
在調用save方法更新數據的時候 會自動判斷當前的數據對象裏面是否有主鍵值存在,如果有的話會 自動作爲更新條件。也就是說,下面的用法和上面等效:
$Model = M('User'); $data['name'] = 'zy'; $data['email'] = '[email protected]'; $Model->data($data)->where('id=8')->save();
讀操作
除了寫操作外,data方法還可以用於讀取當前的數據對象,例如:
$User = M('User'); $map['name'] = 'zy'; $User->where($map)->find(); // 讀取當前數據對象 $data = $User->data();
2017/1/15 21:28:15
find方法 查詢一條數據記錄
find() 方法是和 select() 用法類似的一個方法,不同之處 find() 查詢出來的始終只有一條數據,即系統自動加上了 LIMIT 1 限制。
當確認查詢的數據記錄只能是一條記錄時,建議使用 find() 方法查詢,如用戶登錄賬號檢測:
public function chekUser(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); // 構造查詢條件 $condition['username'] = 'Admin'; $condition['password'] = MD5('123456'); // 查詢數據 $list = $Dao->where($condition)->find(); if($list){ echo '賬號正確'; }else{ echo '賬號/密碼錯誤'; } }
與 select() 的另一個不同之處在於,find() 返回的是一個一維數組,可以在模板裏直接輸出數組單元的值而無需使用 volist 等標籤循環輸出:
{$list['username']}
find() 主鍵查詢
當 find() 查詢的條件參數爲表主鍵時,可以直接將參數寫入方法內,如:
$Dao = M("User"); $list = $Dao->find(1);
user 表主鍵爲 uid,該例子將查詢 uid=1 的數據,這是 ActiveRecords 模式實現之一,簡潔直觀。
setField 方法更新個別字段的值
setField() 方法用於更新個別字段的值。
例子:
public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); $result = $Dao->where('uid = 2')->setField('email','[email protected]'); if($result !== false){ echo '數據更新成功!'; }else{ echo '沒更新任何數據!'; } }
上面例子執行的 SQL 語句爲:
UPDATE user SET email='[email protected]' WHERE uid = 2
更新多個字段
setField() 方法支持同時更新多個字段,只需要傳入數組參數即可:
public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); $result = $Dao->where('uid = 28')->setField(array('username','email'),array('zy2333','[email protected]')); if($result !== false){ echo '數據更新成功!'; }else{ echo '沒更新任何數據!'; } }
setField() 方法的語法爲:
setField(fields, value, condition='')
因此 setField() 不可以像 save() 方法一樣,以構造數據數組的方式傳入 setField(),而需要將需要更新的字段與值分別傳入 setField() 方法中。