以下方法声明在/app/controller中创建的js文件中使用。
数据库的引用(要先在egg中引入和配置好sequlize):
await ctx.model.User.create //User为数据库中的表名, create为方法,引入model文件夹下的user.js文件。 下面内容亦同
1.db增加数据 (create)
async abc(){
const {ctx}=this;
try{
await ctx.model.User.create({
username:'名字1',
phone:'1384654214',
pwd:123456,
balance:0
})
ctx.body="添加成功"
}catch(e){
ctx.body={success:false,info:e}
}
}
函数名自定义为abc,在路由(router.js)中使用调用该方法。
例如:
router.post('/abc',controller.home.abc);
//上方调用代码的含义:controller目录下的home.js文件的abc函数
post请求,在Eolinker软件下访问. get请求可在浏览器URL路径下直接访问。
2. db删除(destroy)
async efg(){
const {ctx}=this;
try{
await ctx.model.User.destroy({
where:{
uid:1
}
})
ctx.body={success:true,info:'ok'}
}catch(e){
ctx.body={success:false,info:e}
}
}
3.db改(update)
async doupdate(){
const{ctx}=this;
try {
await ctx.model.User.update({
phone:'110',
username:'老刘'
},{
where:{
uid:4
}
})
ctx.body="更新成功!"
} catch (error) {
ctx.body="更新失败"+error;
}
}
4.db查
(1)findByPk()
findByPk(主键的值,配置项) 根据主键来查找一个 ,返回的是单个 行实例 找不到返回null
async hij(){
const {ctx,app}=this;
try {
const res=await ctx.model.User.findByPk(2);
ctx.body=res;
} catch (error) {
ctx.body="错误信息"+error;
}
}
(2)findOne()
findOne(配置项)找不到也是返回 null
async hij(){
const {ctx,app}=this;
try {
const res=await ctx.model.User.findOne({
where:{
phone:'1384654214',
username:'老张'
}
})
ctx.body=res;
} catch (error) {
ctx.body="错误信息"+error;
}
}
(3)findAll()
async hij(){
const {ctx,app}=this;
try {
const { Op }=app.Sequelize;
const res=await ctx.model.User.findAll({
where:{
phone:{ [Op.like]:'%1%' } //gt 大于 lt 小于
}
})
ctx.body=res;
} catch (error) {
ctx.body="错误信息"+error;
}
}
可限定条件:
limit:2 限制返回的记录数
offset:1 查询的起点 从第几个开始查
attributes:['uid','phone'], //写法1 限定返回的信息 例:只返回uid phone
attributes:{
exclude:['pwd'] //写法2 排除要查询的字段
}
order:[['uid','DESC']], //ASC顺序 DESC倒序(常用)
(4) 行实例 对应的是某一行 查+改
async hij(){
const {ctx}=this;
try {
const one=await ctx.model.User.findByPk(4);
await one.update({username:'老阳'});
ctx.body=one;
}
catch (error) {
ctx.body='错误信息:'+error;
}
}
await one.destroy(); //删除那一行
await one.increment('balance',{by:5}); //对应行的balance加上5
await one.reload();//reload()加载到最新的状态 increment和decrement如果想获取最新状态,用reload()
5.实现批量创建( bulkCreate([ ]) )
async creates(){
const {ctx}=this;
try {
const res= await ctx.model.User.bulkCreate([
{username:'老鲁',
uid:5,
phone:'12354',
money:23
},
{username:'老秦',
uid:6,
phone:'12357898',
money:230
}
])
ctx.body=res;
} catch (error) {
ctx.body='错误信息:'+error;
}
}
6.findOrCreate({ })
async foc(){
const {ctx}=this;
try {
const res=await ctx.model.User.findOrCreate({
where:{
uid:7,
},
defaults:{
username:'老周',
phone:'911',
money:45,
}
// attributes:{
// exclude:['money']
// }
})
ctx.body=res;
} catch (error) {
ctx.body='出错信息:'+error;
}
}
defaults:如果需要创建的话,需要带上字段的内容,并且主键(uid)不能冲突,如果uid已存在,则是查询。
7.sum与count方法 (常用)
sum('求和字段',配置项)
max('字段',配置项) 返回指定字段的最大值
min('字段',配置项) 返回指定字段的最小值
count(配置项) 返回符合条件的记录数的数量值
对字段money大于60的进行money求和
async num(){
const {ctx,app}=this;
try {
const {Op}=app.Sequelize;
const res=await ctx.model.User.sum('money',{
where:{
money:{[Op.gt]:60}
}
})
ctx.body='总数:'+res;
} catch (error) {
ctx.body='错误信息:'+error;
}
}
8.belongsTo
要查询的源表.belongsTo(要关联的目标表,{foreignKey:'外键的字段',targetKey:'主键的字段')
belongsTo是 一对一关键 而且 外键是在 要查询额源表上面(外键uid在订单表上)
async belong(){
const {ctx,app}=this;
try {
await this.ctx.model.Order.belongsTo(ctx.model.User,{foreignKey:'uid',targetKey:'uid'});
const orderinfo=await ctx.model.Order.findAll({
include:[ctx.model.User]
});
ctx.body=orderinfo;
} catch (error) {
this.ctx.body='出错信息:'+error;
}
}
9.hasMany/hasOne
hasMany是一对多 而且外键是在要关联的目标表上面(外键uid在订单表), hasOne 一对一
include写法1:
async has(){
const {ctx,app}=this;
try {
await ctx.model.User.hasMany(ctx.model.Order,{foreignKey:'uid',targetKey:'uid'});
await ctx.model.User.hasOne(ctx.model.Address,{foreignKey:'uid',targetKey:'uid'});
const userinfo=await ctx.model.User.findAll({
include:[ctx.model.Order,ctx.model.Address]
})
ctx.body=userinfo;
} catch (error) {
this.ctx.body='出错信息:'+error;
}
}
include写法2:
async has(){
const {ctx,app}=this;
try {
await ctx.model.User.hasMany(ctx.model.Order,{foreignKey:'uid',targetKey:'uid'});
await ctx.model.User.hasOne(ctx.model.Address,{foreignKey:'uid',targetKey:'uid'});
const userinfo=await ctx.model.User.findAll({
// include:[ctx.model.Order,ctx.model.Address]
include:[
{
model:ctx.model.Address,
},
{
model:ctx.model.Order,
attributes:{
exclude:['oid']
}
}
],
})
ctx.body=userinfo;
} catch (error) {
this.ctx.body='出错信息:'+error;
}
}
10.聚合函数
聚合函数,用来求和或者求个数
SUM求和
使用方法:
[app.Sequelize.fn('聚合函数 SUM求和 COUNT统计个数',app.Sequelize.col('字段')),'别名']
group:按哪个字段分组
async jhhs(){
const {ctx,app}=this;
try {
const userinfo=await ctx.model.Order.findAll({
attributes:[
// 'uid',
[app.Sequelize.fn('SUM',app.Sequelize.col('price')),'total']
],
// group:'uid'
})
ctx.body=userinfo;
} catch (error) {
this.ctx.body='出错信息:'+error;
}
}