摘要:一個(gè)微型的實(shí)現(xiàn)的庫(kù)體積很小帶詳盡的注釋總共只有行支持鏈?zhǔn)秸{(diào)用支持關(guān)系前言最開始接觸是在學(xué)習(xí)的時(shí)候,那個(gè)時(shí)候覺得用操作數(shù)據(jù)庫(kù)真的是太方便了。但是已經(jīng)算是一個(gè)小型的庫(kù)了。同樣的還提供了簡(jiǎn)寫的以及,等接口函數(shù)。
一個(gè)微型的PHP實(shí)現(xiàn)的AR庫(kù)
體積很小帶詳盡的注釋總共只有400行
支持鏈?zhǔn)秸{(diào)用
支持關(guān)系
最開始接觸ActiveRecord是在學(xué)習(xí)Yii的時(shí)候,那個(gè)時(shí)候覺得用AR操作數(shù)據(jù)庫(kù)真的是太方便了。以至于后來轉(zhuǎn)向其他的一些框架的時(shí)候,感覺沒有了AR似乎就不能操作數(shù)據(jù)庫(kù)了一樣!!!特別是中間自己使用一些簡(jiǎn)單的說不上框架的東西來寫微型的PHP站點(diǎn)的時(shí)候,感覺手寫SQL太難看。
后來也接觸過一些優(yōu)秀的獨(dú)立的ORM的庫(kù),比如我最喜歡的idiorm. 甚至曾經(jīng)萌生了想要把Yii的AR多帶帶拿出來用的想法!但是后來還是沒有實(shí)現(xiàn)。。。
在13年的時(shí)候,有一段時(shí)間上班時(shí)間太清閑,所以當(dāng)時(shí)就想自己實(shí)現(xiàn)一個(gè)ActiveRecord類,一來打算練練手,而來也打算自己以后用的上。
在開始動(dòng)手寫之前,在github,以及stackoverflow上面尋找了一大堆的php的AR庫(kù)或者ORM的庫(kù)。
https://github.com/j4mie/idiorm
https://github.com/vrana/notorm
https://github.com/PrimalPHP/Record
https://github.com/spadgos/Record
https://github.com/sgoen/php.pdo.orm
https://github.com/jaceju/example-my-orm
當(dāng)然其中最好的就是idiorm以及notorm,在github上門分別有1600+和600+的star。
拿idiorm來說,個(gè)人非常喜歡它提供的接口以及使用方式。而且整個(gè)庫(kù)也就單個(gè)文件,雖然文件將近2500行。但是已經(jīng)算是一個(gè)小型的庫(kù)了。當(dāng)然文件有點(diǎn)長(zhǎng),看起來有點(diǎn)費(fèi)勁。
相對(duì)而言notorm設(shè)計(jì)得更加OO一些。不過在其中的NotORM_Result這個(gè)class中明顯看到一大片字符串拼接SQL的方式,還是讓人覺得看起來不是很好。
在看了一堆這樣的ORM的庫(kù)之后,非常反感那種直接拼接SQL的方式,但是這又是一個(gè)無法避開的問題,最后總是需要生成一個(gè)SQL字符串的。
關(guān)鍵在于需要找出一種比較”優(yōu)雅“的方式來完成這個(gè)拼接的工作。
有一天在看拼接的SQL的時(shí)候偶然間感覺SQL里面where后面的那些查詢條件總是一個(gè)一個(gè)的表達(dá)式(一個(gè)操作數(shù)加上一個(gè)操作符再加上一個(gè)操作數(shù),例如:name="demo" and email="demo@demo.com")。
這個(gè)表達(dá)式的結(jié)構(gòu)看起來和數(shù)學(xué)里面的(1+1)*(2+2)是那么的相像。
甚至連and,or也是一個(gè)一個(gè)的操作符而已。再提煉一下除了二元表達(dá)式,還有一元表達(dá)式(只有一個(gè)操作數(shù)的表達(dá)式,類似數(shù)學(xué)里面的-1)。這樣算起來SQL里面的select,from,where,delete,update這樣的關(guān)鍵詞都可以算成是”操作符“了。
那么一個(gè)簡(jiǎn)單的SQL就可以分解成一個(gè)一個(gè)的表達(dá)式:
select email, password from `user` where email = "demo@demo.com";
select email, password
from user
where email = "demo@demo.com"
email = "demo@demo.com"
上面的SQL總共拆分出來了4個(gè)表達(dá)式,其中where部分是嵌套的一個(gè)表達(dá)式。
實(shí)現(xiàn) Expressions所以,我專門定義了一個(gè)Expressions類用來表示SQL中的各個(gè)部分。這個(gè)類只有一個(gè)__toString方法在最后需要的時(shí)候生成SQL
class Expressions extends Base { public function __toString() { return $this->source. " ". $this->operator. " ". $this->target; } }
當(dāng)然還有比較特殊的表達(dá)式就是"()",這個(gè)表達(dá)式特殊在于操作符是分開的。
接口當(dāng)提煉出來了表達(dá)式的類之后,那么在使用ActiveRecord查詢數(shù)據(jù)庫(kù)的時(shí)候,每輸入一個(gè)動(dòng)詞,都只是在適當(dāng)?shù)牡胤讲迦胍粋€(gè)表達(dá)式而已。只有在最后的時(shí)候才會(huì)一次性的調(diào)用每一個(gè)表達(dá)式的__toString方法組合SQL,為了安全考慮,使用了PDO的綁定參數(shù)的形式防止SQL注入的風(fēng)險(xiǎn)!
比如:
$user->equal("id", 1); 只是在where子句里面生成了一個(gè) "id=:ph1"的表達(dá)式,同時(shí)保存了一個(gè)array(":ph1"=>1)的參數(shù)而已。同樣的還提供了簡(jiǎn)寫的”eq“以及”ne“,”ge“等接口函數(shù)。另外還有”select“,”from“,”group“,”order“,”limit“,”top“以及”where“等接口函數(shù)。魔術(shù)方法
為了減少代碼量,所以這里使用了__call魔術(shù)方法避免了為每一個(gè)動(dòng)作都去定義個(gè)method。
關(guān)系除了實(shí)現(xiàn)SQL的基本操作,還實(shí)現(xiàn)了一下類似Yii的ActiveRecord法讓Relation的方法可以簡(jiǎn)單的通過主外鍵關(guān)系查詢數(shù)據(jù)。
定義了”HAS_ONE“,”HAS_MANY“和”BELONGS_TO“三種關(guān)系。
可以在定義關(guān)系之后,能通過簡(jiǎn)單的的訪問屬性的方式獲得關(guān)聯(lián)的數(shù)據(jù)。
項(xiàng)目地址:https://github.com/lloydzhou/activerecord
文檔地址:https://lloydzhou.github.io/activerecord
已經(jīng)提交到packagist.org可以通過composer安裝
composer require lloydzhou/activerecordDEMO
為了一邊測(cè)試,一邊完善這個(gè)庫(kù)。所以使用這個(gè)庫(kù)結(jié)合另外一個(gè)Router和 MicroTpl 寫了一個(gè)簡(jiǎn)單的 博客 ,里面基本涵蓋了這幾個(gè)庫(kù)的API。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21147.html
摘要:權(quán)限中心的依賴聲明聲明依賴關(guān)系檢查代碼規(guī)范聲明開發(fā)依賴命名空間檢查代碼規(guī)范,執(zhí)行單元測(cè)試。單元測(cè)試持續(xù)交付一切都如此的完美,沒有測(cè)試,又如何可以證明這件事情的完美,又如何可以保障交付的質(zhì)量。 序 權(quán)限管理是無線運(yùn)營(yíng)系統(tǒng)中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關(guān)系。 本文著重講解如何通過PHP來構(gòu)建一個(gè)靈活、通用、安全的權(quán)限管理系統(tǒng)。 關(guān)于權(quán)限 首先我們來聊聊權(quán)限。 權(quán)...
摘要:在這個(gè)后面執(zhí)行用戶自定義的,這些是在定義回調(diào)函數(shù)的時(shí)候一起給定當(dāng)前需要調(diào)用的列表。而傳統(tǒng)的以正則表達(dá)式做映射方式,查找回調(diào)函數(shù)時(shí)間不穩(wěn)定,最壞情況需要執(zhí)行一遍所有的正則表達(dá)式。 之前使用dispatch, 但是從4.0到現(xiàn)在的8.0 API變動(dòng)比較大,特別是在最近兩次大的版本的升級(jí),為了保持代碼簡(jiǎn)潔丟失了向下兼容的特性。 感覺作者的的核心思想不是很堅(jiān)定。所以生出了自己造輪子的沖動(dòng)。 r...
摘要:今天把這個(gè)問題講明白了,看看是怎么個(gè)多表關(guān)聯(lián)以及如何去優(yōu)化這個(gè)關(guān)聯(lián)。現(xiàn)需要在列表展示表的來源渠道,且該渠道可搜索。關(guān)聯(lián)表字段增加查詢中的搜索模型也是通過實(shí)現(xiàn)的,該模型通過控制著哪個(gè)字段可搜索,哪個(gè)字段不可搜索。 作者:白狼 出處:http://www.manks.top/yii2_many_ar_relation_search.html 本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留...
摘要:每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開發(fā)的,也是一個(gè)開源的框架。 對(duì)于Web開發(fā)者來說,PHP是一款非常強(qiáng)大而又受歡迎的編程語(yǔ)言。世界上很多頂級(jí)的網(wǎng)站都是基于PHP開發(fā)的。 每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項(xiàng)目之前選...
摘要:安全生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù)一個(gè)兼容標(biāo)準(zhǔn)的過濾器一個(gè)生成隨機(jī)數(shù)和字符串的庫(kù)使用生成隨機(jī)數(shù)的庫(kù)一個(gè)安全庫(kù)一個(gè)純安全通信庫(kù)一個(gè)簡(jiǎn)單的鍵值加密存儲(chǔ)庫(kù)一個(gè)結(jié)構(gòu)化的安全層一個(gè)試驗(yàn)的面向?qū)ο蟮陌b庫(kù)一個(gè)掃描文件安全的庫(kù) Security 安全 生成安全的隨機(jī)數(shù),加密數(shù)據(jù),掃描漏洞的庫(kù) HTML Purifier-一個(gè)兼容標(biāo)準(zhǔn)的HTML過濾器 RandomLib-一個(gè)生成隨機(jī)數(shù)和字...
閱讀 4549·2021-09-10 11:22
閱讀 530·2019-08-30 11:17
閱讀 2564·2019-08-30 11:03
閱讀 430·2019-08-29 11:18
閱讀 3455·2019-08-28 17:59
閱讀 3218·2019-08-26 13:40
閱讀 3157·2019-08-26 10:29
閱讀 1137·2019-08-26 10:14