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