文档章节

mysq数据框架bookshelf文档

mosaic101
 mosaic101
发布于 2016/03/14 23:29
字数 848
阅读 168
收藏 1

ORM bookshelf

文档地址:bookselfjs.org、knexjs.org

之前项目用的mysq数据框架bookshelf(基于knex),基本操作文档以及demo。

一、基本操作

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:没测试。。后续写个增删改查的用户管理,再完善


二、高级操作

基本注意事项

1、在fetch的时候尽量加上option参数{required:true} 这样如果没有结果会自动返回Promise.reject(NotFoundError) 并且尽量只select 需要查询/修改的字段 {columns:[...]} save的时候加上option参数{required:true} ,如果save失败会自动返回Promise.reject(NoRowsUpdatedError) 2、添加:save({method:'insert'}) 3、复杂条件查询使用query:

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.*

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所关注的疾病名称

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关系是这样,其他关系有待验证)

through 的具体用法在文档中没有写明,但作者已经在github上更新了through的用法,最新版本的bookshelf trough应该是这样

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

事务

例子: 添加一个评论时,相应的商品表数据更新 注意:在所有save操作中请传option参数{transacting:事务参数 例子中的a_transacting} 如果没法在一个handler里面处理所有操作,请手动commit和rollback事务 comment:

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})
    }


© 著作权归作者所有

mosaic101
粉丝 28
博文 31
码字总数 12966
作品 0
浦东
程序员
私信 提问
Android 开发设计模式第一篇:迭代器模式

Iterator Pattern迭代器模式 场景猜想   经常编写代码都会碰到遍历一个数组,使用for循环得到数组下标之后去做进一步操作。例如下文代码: int[] array=new int[5]; for(int i=0;i<array....

JayPark不作死
2014/07/03
0
0
图解设计模式之Iterator模式

一:什么是Iterator模式? 将循环变量i的作用抽象化,通用化形成的模式,在设计模式中称为Iterator模式(迭代器模式),该模式用于在数据集合中按照顺序遍历集合 二:为什么要有Iterator模式?...

小四的窝
2018/06/19
0
0
设计模式学习笔记(12)迭代器

本文实例代码:https://github.com/JamesZBL/javadesign_patterns 迭代器(Iterator)模式又称游标模式,是集合类型对外提供统一的顺序访问元素而隐藏内部的实现细节的一种方式,是一种行为模...

摆码王子
2018/05/21
0
0
怎样解决 Ubuntu 中的 “sub process usr bin dpkg returned an error code 1” 错误

如果你在 Ubuntu Linux 上安装软件时遇到 “sub process usr bin dpkg returned an error code 1”,请按照以下步骤进行修复。 Ubuntu 和其他基于 Debian 的发行版中的一个常见问题是已经损坏...

38%
2018/09/29
0
0
学习apache commons的兴趣小组

我打算commons的源码,大约2-3周读一个组件,并且写用法和源码心得的主题 目前的计划读的顺序如下: Lang Math Primitives BeanUtils Collections Digester IO Configuration Pool DBCP DbU...

笨笨熊
2010/04/10
554
3

没有更多内容

加载失败,请刷新页面

加载更多

读书replay《maven实战》.1.20190526

前情提要 maven这个工具用了好久了,但是一直都用的迷迷糊糊的,没有对它进行过系统性的学习,只是知道一些常用的功能怎么实现,所以20190516这一天我从JD购买了徐晓斌老师所著的《maven实战...

wanxiangming
26分钟前
0
0
真实项目案例实战——【状态设计模式】使用场景

什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。 状态模式应用场景 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根...

须臾之余
33分钟前
0
0
Java 实现把字符串转换成整数【底层实现】

https://blog.csdn.net/zl18310999566/article/details/80263396

qimh
36分钟前
0
0
IDEA的debugger

1、win下节省内存空间 3、条件断点

一只小青蛙
47分钟前
3
0
炸!亿级数据DB秒级平滑扩容

一步一步,娓娓道来。 一般来说,并发量大,吞吐量大的互联网分层架构是怎么样的? 数据库上层都有一个微服务,服务层记录“业务库”与“数据库实例配置”的映射关系,通过数据库连接池向数据...

编程SHA
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部