對于Sails來說,它的Model與數據庫對應,不過它并沒有采用目前比較流行的poco貧血模型,而是采用了類似DDD的充血模型,即它的數據實體里即有數據庫字段(屬性)而且還有方法,而模型里的方法主要用來修飾它的屬性,如屬性的有效性,屬性的賦值,插入前和更新前的動作等等,下面我們通過具體的實例代碼來說一下sails實體模型的用法。
一 定義一個Person實體
module.exports = {
autoPK:true,//這是默認值,可以省略 tableName: 'UserInfo', attributes: { name: { type: 'string', size: 255 }, sex: { type: 'integer', defaultsTo: 0 }, updateCount:{ type:'integer', defaultsTo: 0 } } };
二 對model相關參數的說明
通過上面的代碼我們知道了在sails中數據模型的類型,除了上面的string,integer,還有以下數據類型
- float
- text
- date
- datetime
- boolean
- binary
- array
- json
除了數據類型外,還有以下幾個知識點需要我們知道的
tableName:表示數據庫中數據表的名稱
defaultsTo:表示屬性的默認值
size:表示數據長度
email:可以添加對emial字段的約束,email:true
unique:表示這個字段在數據表中是唯一的標示,如用戶表,有些業務要求用戶名是唯一的,我們就可以利用unique這個特性,
primaryKey:可以讓我們把某個字段定義成數據表的主鍵,但在使用它時,要確保model的autoPK為false否則會有沖突(默認為true)
autoPK:是否自動生成主鍵字段id,true表示自動生成主鍵,false不生成,sails為各種數據庫訂制了主鍵生成規則,由mysql,sqlserver為自增主鍵,而mongodb為objectid主鍵
autoCreateAt:自動生成createAt字段,即添加時間
autoUpdateAt:自動生成updateAt字段,即當記錄有更新時,這個時間被自動更新
enum:表示某個字段可以以枚舉的形式保存,它所存儲的值為這個枚舉的某個元素
columnName:為實體指定特殊的數據表列名,這類似于tableName
三 beforeUpdate和beforeCreate的作用
通過上面代碼我們可以在數據添加前和更新上做一些事情,這也是充血模型的優勢,它將與屬性本身有關的邏輯寫到了屬性內容,而不是寫在service方法里,這有效的提高了對象的內聚性,也是面向對象的體現,下面的代碼在記錄更新時,對updateCount字段進行加1操作,代碼很簡單,但可以說明它的作用。
beforeCreate: function (values, next) {
values.password = md5(values.password,"zzl");//添加記錄時,為密碼進行加密策略,這由于屬于密碼本身的特性,所以寫在這里比在業務代碼更合適/
next();
}
beforeUpdate: function (values, next) {//values這個對象是從前臺傳過來的對象 values.updateCount+=1; next(); }
這里要注意一點,你的values對象是前臺傳給service層的對象,不是從數據表里取出來的原始對象,這點要注意,有些想通過這個功能實現數據追蹤的,無法簡單實現!
文章列表