mysq數據框架bookshelf文檔

ORM bookshelf

文檔地址:bookselfjs.org、knexjs.orggit

以前項目用的mysq數據框架bookshelf(基於knex),基本操做文檔以及demo。
github

1、基本操做

1.定義

var baseBookshelf = require('./base/index'),
    User,
    Users;       //繼承父類
     User = baseBookshelf.Model.extend({
        tableName: 'users' //表名定義
     },{//行爲封裝、基於增刪改查,輸入數據校驗,輸出格式化等等吧!
        add: function add(data, options) {  
            return baseBookshelf.Model.add.call(self, data, options);
        }
    });


Users = baseBookshelf.Collection.extend({
    model: User
});module.exports = {
    User: baseBookshelf.model('User', User),
    Users: baseBookshelf.collection('Users', Users)
};

2.使用

var dataProvider = require('../../common/models');
添加User
dataProvider.User.add({
     name: name
    , phone: account
    , password: pass
  }).then(function (result) {
     res.sendStatus(200);
  }).catch(function(error) {       //異常處理 
  });
查找User
//根據 phone字段
  dataProvider.User.findOne({phone:phone}).then(function (user) {          
  });
刪除User
//根據 phone字段
  dataProvider.User.destroy({phone:phone}).then(function (user) {          
  });//TODO:沒測試。。後續寫個增刪改查的用戶管理,再完善


2、高級操做

基本注意事項

一、在fetch的時候儘可能加上option參數{required:true} 這樣若是沒有結果會自動返回Promise.reject(NotFoundError) 而且儘可能只select 須要查詢/修改的字段 {columns:[...]} save的時候加上option參數{required:true} ,若是save失敗會自動返回Promise.reject(NoRowsUpdatedError) 二、添加:save({method:'insert'}) 三、複雜條件查詢使用query:web

Model.query(functoin(qb){            
            if(content){                
                var likeContent = '%'+content+'%';
                qb.where('name','like',likeContent)
            };            
            if(type_id){
                qb.where('type_id','=',type_id)
            };            
            if(column){
            qb.orderBy(column, order||'asc');
            }
            qb.limit(10).offset(5)
}).fetch()....

where: (condition1 && condition2) || condition3框架

qb.where(function(qb2){
    qb2.where(condition1).andWhere(condition2)
}).orWhere(condition3)

聯表查詢

例:聯表查詢 consult.id、consult.content、commodity.name、user.*ide

var Consult = bookshelf.Model.extend({
    tableName: 'mall_consult',
    commodity:function(){        
        return this.belongsTo(Commodity, "commodity_id"); // commodity_id: 該model中的外鍵
    },
    user:function(){        
        return this.belongsTo(User, 'user_id');
    }

}
})var Commodity = bookshelf.Model.extend({    
    tableName: 'mall_commodity' 
    consults:function(){        
        return this.hasMany(Consult, 'commodity_id'); //commodity_id: 目標model中的外鍵
    }
})

//聯表查詢 consult.id consult.content commodity.name user.*測試

{joinQuery : function (){   return this.where(條件).fetch({
        columns:['id','content','commodity_id','user_id']}, //這裏必須包括外鍵    
        required:true,
        withRelated:[ {
            commodity:function(qb){qb.column(['id','name'])
            // 這裏column或者select裏必須包含與原model外鍵對應的column;
            //query builder能夠執行一系列查詢操做 詳見http://knexjs.org/
        },'user']
).then(function(resp){    return resp;
})
}}

經過關聯表查詢

user (this表),follow_disease (Interim表),disease (target表)
經過follow_disease 查詢user所關注的疾病名稱fetch

var user = bookshelf.Model.extend({
        tableName:"user",
        disease_followed:function(){        
            return this.hasMany(disease).through(follow_disease,'id').query(function(qb){
                qb.column(['disease.id','disease.name'])
            })
        }
})
var follow_disease= bookshelf.Model.extend({        
    idAttribute:'disease_id',        
    tableName:"follow_disease",
    })
var disease = bookshelf.Model.extend({        
    tableName:"disease_followe"
    })
user.where({uid:uid}).fetch({withRelated:['disease']})

在咱們如今的版本中,through中第二個參數是target表的主鍵,管理表須要設置idAttribute=管理表中關聯到target表的外鍵(hasMany關係是這樣,其餘關係有待驗證)ui

through 的具體用法在文檔中沒有寫明,但做者已經在github上更新了through的用法,最新版本的bookshelf trough應該是這樣this

this.hasMany(Target).through(Interim, throughForeignKey, otherKey)

事務

例子: 添加一個評論時,相應的商品表數據更新 注意:在全部save操做中請傳option參數{transacting:事務參數 例子中的a_transacting} 若是無法在一個handler裏面處理全部操做,請手動commit和rollback事務 comment:spa

addComment: function(){        
    var comment = {id:7,content:'pretty good!',level:2,commodity_id:27}        
    var self = this;        
    return baseBookshelf.transaction(function(a_transacting){
            console.log('begin')            
            return self.add(comment,{required:true,transacting:a_transacting,method:'insert'})
            .then(function (result){                
                    return dataProvider.Commodity
                    .updateScore(comment.commodity_id,{transacting:a_transacting})
                    .then(a_transacting.commit)
                    .catch(a_transacting.rollback)
                  })
            })
            .then(function(resp){                
                return resp;})
            .catch(function(err){                
            return Promise.reject(new baseBookshelf.Model.NoRowsUpdated());})
        }

commodity

updateScore:function(id,option){        
    return this.where({id: id}).fetch(option).then(function (result) {         
        /*處理result*/
       return result.save(param,option);
})
}

並行

添加 評價時:更新該商品評分、修改該訂單變爲不可評論

var self = this; return baseBookshelf.transaction(function(t){            
    return Promise.try(function(){                    
        return [                        
            self.add(comment,{required:true,transacting:t}),
            dataProvider.Commodity.updateScore(comment.commodity_id, comment.level,t),
            dataProvider.Order.comment(comment.order_id,t)
            ]
         })
         .all().then(t.commit).catch(t.rollback)
    })
         .then(function(resp){return resp})
    }
相關文章
相關標籤/搜索