W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
先在這里感謝phalapi框架創(chuàng)始人@dogstar,為我們提供了這樣一個(gè)優(yōu)秀的開源框架.
寫本篇教程的起因是在于在交流的時(shí)候有位童鞋提出了fetchPairs有BUG,原來(lái)一直沒(méi)有仔細(xì)的了解過(guò)notorm的細(xì)節(jié),趁這次機(jī)會(huì)主要把notorm之中的一些方便快捷的操作簡(jiǎn)單的說(shuō)明一下,以及對(duì)與事務(wù)操作做一些我自己的簡(jiǎn)介以及使用notorm如何實(shí)現(xiàn).
附上:
喵了個(gè)咪的博客:w-blog.cn
官網(wǎng)地址:http://www.phalapi.net/
開源中國(guó)Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release
在notorm有很多方便并沒(méi)有在PhalApi官方文檔中有并沒(méi)有非常詳細(xì)的介紹過(guò),在這里把一些可能會(huì)用到的notorm函數(shù)坐下介紹以及功能
fetchPairs的使用和fetchAll相似但是他有一個(gè)特別之處,fetchPairs需要傳遞一個(gè)參數(shù),這個(gè)參數(shù)是字符串的key值(比如 name id)當(dāng)傳遞之后會(huì)出現(xiàn)這樣的對(duì)比效果
DI()->notorm->user->fetchPairs('name');
DI()->notorm->user->fetchAll('name');
大家有看到區(qū)別嗎?
嗯!是在返回的時(shí)候把在之前定義的key值放到了返回?cái)?shù)組的key中
提示:在老版本中在使用過(guò)程中 Result.php 會(huì)有一句 821行的報(bào)錯(cuò)需要把
$values = array_values(iterator_to_array($row));
改成
$values = array_values($row);
lock操作是一種鎖的行為,對(duì)于整表進(jìn)行鎖定,在當(dāng)前用戶釋放鎖之前此表不能在被操作,lock接受一個(gè)bool參數(shù),默認(rèn)是true鎖表,使用如下
$userdb = DI()->notorm->user->lock(); //鎖定表
$rs = $userdb->fetchAll();
生成的sql語(yǔ)句如下:
SELECT * FROM user FOR UPDATE;
在很多時(shí)候我們會(huì)用到,數(shù)據(jù)庫(kù)里面某個(gè)值+1或者是其他,我們不能在update的時(shí)候?qū)懭隺rray('key' => 'key+1')因?yàn)樵诮馕鰏ql的時(shí)候 key+1 會(huì)帶上引號(hào)作為一個(gè)字符串處理,當(dāng)然是有解決方法的,如下
DI()->notorm->user->where('id', 1)->update(array('sum' => new NotORM_Literal("sum + 1")));
這樣就可以生成不帶引號(hào)的操作了
UPDATE user SET phone = sum + 1 WHERE (id = 1);
group是去重操作,在notorm里面也封裝的有,我們可以使用group用于統(tǒng)計(jì)有多少同名的用戶等一些統(tǒng)計(jì)操作,或者是找出庫(kù)里面不重復(fù)的城市名
DI()->notorm->user->select('name , count(*) as count')->group('name')->fetchAll();
會(huì)獲得如下結(jié)果
在我們使用過(guò)程中雖然使用這類操作不是很多,但是使用notorm的快速函數(shù)依然感覺很方便,
return DI()->notorm->user->sum('id'); //做加法
return DI()->notorm->user->max('id'); //獲取這個(gè)key中最大的值
return DI()->notorm->user->min('id'); //獲取這個(gè)key中最小的值
return DI()->notorm->user->count(); //統(tǒng)計(jì)一共幾條數(shù)據(jù)
其實(shí)很大一部分使用事務(wù)的目的是應(yīng)為害怕并發(fā)的情況下導(dǎo)致,對(duì)數(shù)據(jù)庫(kù)造成重復(fù)的操作,比如如下場(chǎng)景:
應(yīng)用審核,有兩個(gè)管理者對(duì)同一個(gè)應(yīng)用審核,一個(gè)成功一個(gè)失敗,然后是同時(shí)請(qǐng)求過(guò)來(lái)的,一起到了查詢應(yīng)用狀態(tài)發(fā)現(xiàn)都是未審核,然后都去進(jìn)行了審核操作,這個(gè)時(shí)候兩個(gè)操作返回的都是審核成功,但是有一個(gè)人會(huì)看到審核狀態(tài)和自己的審核結(jié)果不同,這個(gè)就是問(wèn)題了,大部分解決此類問(wèn)題時(shí)都會(huì)考慮到使用數(shù)據(jù)庫(kù)事務(wù)操作,其實(shí)對(duì)于事務(wù)操作我的建議是能不用盡量不要使用,我簡(jiǎn)單聊一下我的幾個(gè)觀點(diǎn)
是否真的那么重要,對(duì)于上面的問(wèn)題也許乍一看上去感覺,這樣怎么可以呢,但是仔細(xì)想一想,這兩個(gè)操作都是屬于我們管理者的正常的操作,真正對(duì)于業(yè)務(wù)來(lái)說(shuō)我認(rèn)為是沒(méi)有問(wèn)題的,當(dāng)然這是因?yàn)橛绊懖淮?如果是付款,一個(gè)訂單從兩個(gè)地方同時(shí)付款然后都發(fā)現(xiàn)是未付款,然后都進(jìn)行了付款,這種業(yè)務(wù)就必須有處理方式了,所以是否使用事務(wù)要看業(yè)務(wù)是否非常需求
概率是怎么樣的,對(duì)于一個(gè)程序來(lái)說(shuō),兩條請(qǐng)求剛好通過(guò)了查詢過(guò)程,一同到了修改的時(shí)候,不管是什么場(chǎng)景發(fā)生這種并發(fā)沖突的可能性是極其微小的,我覺得幾乎可以忽略(當(dāng)然前提是重要性沒(méi)有那么的高,我們不能以偏概全)
那么我們使用notorm中解決此類需要用到事務(wù)的問(wèn)題呢
notorm提供了常規(guī)的事務(wù)操作如下
//第一步:先指定待進(jìn)行事務(wù)的數(shù)據(jù)庫(kù)(通過(guò)獲取一個(gè)notorm表實(shí)例來(lái)指定;否則會(huì)提示:PDO There is no active transaction)
$user = DI()->notorm->user;
//第二步:開啟事務(wù)開關(guān)(此開關(guān)會(huì)將當(dāng)前全部打開的數(shù)據(jù)庫(kù)都進(jìn)行此設(shè)置)
DI()->notorm->transaction = 'BEGIN';
//第三步:進(jìn)行數(shù)據(jù)庫(kù)操作
$user->insert(array('name' => 'test3',));
$user->insert(array('name' => 'test4',));
//第四:提交/回滾
DI()->notorm->transaction = 'COMMIT';
//DI()->notorm->transaction = 'ROLLBACK';
還有一種處理方式就是在操作之前進(jìn)行l(wèi)ock鎖表
$user = DI()->notorm->user;
$user->lock();
$user->insert(array('name' => 'test3',));
$user->insert(array('name' => 'test4',));
這兩種方式大家可以自行取舍
注:在phalapiV1.31版本后有自帶提供事務(wù)操作可參考文檔
在本小節(jié)中,對(duì)于notorm之中的一些特別的封裝函數(shù)進(jìn)行了一系列的介紹,以及對(duì)于事務(wù)提出了我的看法以及觀點(diǎn),和使用notorm的解決方案,希望看了這篇教程的童鞋對(duì)你的日常開發(fā)有所幫助
注:筆者能力有限有說(shuō)的不對(duì)的地方希望大家能夠指出,也希望多多交流!
官網(wǎng)QQ交流群:421032344 歡迎大家的加入!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: