YII中實(shí)現(xiàn)兩種類型的模型,分別是表單模型和活動(dòng)記錄。在持久化數(shù)據(jù)方面,YII只實(shí)現(xiàn)了活動(dòng)記錄,對(duì)于復(fù)雜的數(shù)據(jù)關(guān)系可以用框架提供的DAO來(lái)自己寫model,對(duì)應(yīng)集成doctrine這樣的ORM還沒有仔細(xì)研究過(guò)。 ar模型 框架中的model是CModel子類,CModel主要是一些驗(yàn)證與錯(cuò)誤處理,并實(shí)現(xiàn)迭代器和數(shù)組訪問接口,活動(dòng)記錄模型CActiveRecord是AR模型的基類。 每個(gè)AR類代表一個(gè)單獨(dú)的數(shù)據(jù)表,一個(gè)AR實(shí)例則代表那個(gè)表中的一行。AR是一種對(duì)象關(guān)系映射(ORM)的設(shè)計(jì)模式,它負(fù)責(zé)數(shù)據(jù)持久化. 封裝了數(shù)據(jù)庫(kù)CURD操作,同時(shí)它是一種領(lǐng)域模型(Domain Model), 封裝了部分業(yè)務(wù)邏輯。一個(gè)AR類中包括了表結(jié)構(gòu)(Table Schema),約束以及 CURD 實(shí)例化model有兩種方法,直接new一個(gè)新的實(shí)例,或者用靜態(tài)方法mode(),后者與前者的區(qū)別是略過(guò)構(gòu)造函數(shù)執(zhí)行的代碼(主要是避免元數(shù)據(jù)的多次獲?。渺o態(tài)方法mode()創(chuàng)建ar對(duì)象經(jīng)過(guò)一下步驟:-
- $model=self::$_models[$className]=new $className(null);
- new CActiveRecordMetaData($model)
-
- $model->getDbConnection()
- ->getSchema()
- ->getTable($tableName)
- ->loadTable()
- ->findColumns()
- ->findConstraints()
-
-
- $model->attachBehaviors($model->behaviors());
上面流程下來(lái)會(huì)遇到一個(gè)問題,每一次創(chuàng)建model都會(huì)執(zhí)行"SHOW COLUMNS FROM $tableName"和"SHOW CREATE TABLE $tableName"的查詢,在高并發(fā)下會(huì)影響性能??梢栽谥髋渲梦募械臄?shù)據(jù)庫(kù)配置中添加schemaCachingDuration和schemaCacheID的配置來(lái)緩存數(shù)據(jù)庫(kù)schema,前者是設(shè)置緩存的時(shí)間,后者是緩存組件的id,但緩存帶來(lái)的問題是修改數(shù)據(jù)庫(kù)中表結(jié)構(gòu)不能立即生效,所以在生產(chǎn)環(huán)境下寫一個(gè)刷新緩存的腳本是又必要的。
DAO ar模型帶來(lái)的好處是將開發(fā)中SQL語(yǔ)句的編寫減到最小,ar模型既封裝了數(shù)據(jù)庫(kù)記錄的狀態(tài)和持久化到數(shù)據(jù)庫(kù)的訪問方法,也封裝了業(yè)務(wù)邏輯,這在關(guān)系不是很復(fù)雜的應(yīng)用中帶來(lái)的好處顯而易見,但如果數(shù)據(jù)庫(kù)關(guān)系復(fù)雜,業(yè)務(wù)邏輯復(fù)雜,有必要將對(duì)數(shù)據(jù)的操作單獨(dú)提出來(lái),YII中的DAO就是將業(yè)務(wù)邏輯和數(shù)據(jù)交換分開,也降低了業(yè)務(wù)和數(shù)據(jù)庫(kù)的耦合性。 YII中DAO基于PDO,統(tǒng)一的接口可以訪問不同的數(shù)據(jù)庫(kù)管理系統(tǒng)。在框架中CDbConnection、CDbCommand、CdbDataReader、CDbTransaction類分別管了數(shù)據(jù)量的連接、命令、讀取和事務(wù)。 YII還對(duì)數(shù)據(jù)庫(kù)的schema進(jìn)行映射,一個(gè)數(shù)據(jù)庫(kù)是對(duì)應(yīng)一個(gè)對(duì)象,一個(gè)表對(duì)應(yīng)一個(gè)對(duì)象,一列對(duì)應(yīng)一個(gè)對(duì)象,這些對(duì)象分別封裝其對(duì)應(yīng)schema的一些操作。
|