数据库相关

关系定义

定义关系之后的使用

relations: {
"images": {
"type": "hasMany",
"model": "image",
"polymorphic": "imageable"
}
} //
Item.create(itemData).then((item)=> {
item.image.create().then(){
}
})

继承默认User表

  • 已经继承了username,password属性;
//一般表的结构
{
"name": "other",
"base": "PersistedModel",
....
} //继承User表的结构
{
"name": "user",
"base": "User",
...
}

修改数据类型为指定数据库类型

"details": {
"type": [
"object"
],
"postgresql": {
"dataType": "text"
}
}

使用mixins

  • 对于定义表中大部分都会定义的相同属性提取出来定义
  • server/model-config.js:
{
...
"mixins": [
"loopback/common/mixins",
"loopback/server/mixins",
"../common/mixins",
"./mixins"
]
...
}
  • common/models/*.json
{
...
"mixins": {"Timestamp": {"myOption": 1}},
...
}
  • common/mixins/timestamp.js
module.exports = function(Model, options) {
// Model is the model class
// options is an object containing the config properties from model definition
Model.defineProperty('created', {type: Date, default: '$now'});
Model.defineProperty('modified', {type: Date, default: '$now'});
}

使用正则表达式

Item.find({
where: {
or: [
{
a: {regexp: ...}, //{like: '%%'}
b: {regexp: ...}
}
]
}
}).then(items=> callback(null, items)).catch(callback);

测试辅助

  • 定义测试时自动更新的数据库
  app.datasources.pg.autoupdate([
'user',.....
]);

测试时使用:以chai为例

describe('Item Model definition', ()=> {
let db = app.datasources.pg;
let item = db.getModelDefinition('item'); it('has the following properties', ()=> {
expect(item.properties.content.type).to.eql(String);
expect(item.properties.thumbsup.type).to.eql(Number);
expect(item.properties.userId.type).to.eql(Number);
.....
});
});

测试前删除数据:

beforeEach(done=> {
app.dataSources.pg.automigrate(['item','tag','image'], ()=> {
Item.create(itemData).then((item)=> {
itemOne = item;
itemId = item.id;
done();
})
})
});
.....
});

继承loopback自定义的数据库

{
"name": "user",
"base": "User",
...
}

debug运行

DEBUG=* npm start

数据库关系

BelongsTo

  • 一对多,一对一关系;
  • 对面是hasMany,hasOne

HasMany

  • 一对多关系:
  • 对面是belongsTo

HasOne

  • 一对一关系;
  • 对面是belongsTo

HasManyThrough

  • 多对多关系;
  • 第三方表是两个belongsTo

  • 自己与自己表多对多关系,需要新增keyThrough属性

HasAndBelongsToMany

  • 多对多关系, 在第三张表不保存id外其他属性时使用,简化版的HasManyThrough
  • 对面也是hasAndBelongsToMany

Polymorphic relations

loopback常用命令

  • slc loopback:model : 创建数据表
  • slc loopback:acl : 数据表权限设置

常用数据库操作

创建

  • PersistedModel.create(data, callback): 创建
  • PersistedModel.upsert(data, callback): 更新或插入
  • PersistedModel.findOrCreate([where], data, callback): 不存在创建,存在则返回
  • persistedModel.save([options], callback): 更新,如果没有id字段,则创建

更新

  • PersistedModel.updateAll([where], data, callback) 更新
  • persistedModel.updateAttribute(name, value, callback) 更新属性
  • persistedModel.updateAttributes(data, callback) 更新属性
  • PersistedModel.createUpdates(deltas, callback)
  • PersistedModel.bulkUpdate(updates, callback): 按数组更新;

销毁

  • PersistedModel.destroyAll([where], callback): 销毁
  • PersistedModel.destroyById(id, callback): 根据id销毁

debug检查

  • DEBUG=loopback:connector:postgresql npm start

使用loopback自带的数据验证;

使用loopback-console直接操作数据;

关于hook

  • before|afterRemote();
  • observe();
  • 例子
  • 获取其他数据表: loopback.getModel('xxx');

添加方法

  • 整个模型的方法
  Item.search = function(filter, keyword, callback) {
filter = filter || {};
let query = {regexp: `/${keyword}/i`}; delete filter.where; if (keyword) {
filter.where = {
or: [
{content: query, deleted: false, visible: true},
{tagString: query, deleted: false, visible: true}
]
};
} Item.find(filter).then(items=> callback(null, items)).catch(callback);
};
  • 单个模型实例的方法
  Activity.prototype.increaseViews = function(nums, callback) {
callback(null, {views: this.views});
}; Activity.beforeRemote('prototype.increaseViews', (ctx, instance, next)=> {
const nums = ctx.req.query.nums || 1;
instance && instance.updateAttribute('views', instance.views + Number(nums))
.then(()=> next()).catch(next);
});
  • 设置权限(如果开启了的话)
  • 添加远程说明
  Item.remoteMethod('search', {
description: '',
accepts: [
{ arg: 'filter', type: 'object', http: {source: 'query|object'} },
],
http: {verb: 'get|post|put...'},
returns: { root: true, type: '' }
});

去掉explore

  • 分别删除root/explore.js, components.config

数据筛选

  • 只返回特定的属性: { fields: {id: true, make: true, model: true} }, 例子

    • 注意id必须有,同时用include的话,相关的id也必须有;
  • include数据:
    • 单用的话可以是数组或字符串;
    • 扩展的话可以是数组或对象; 例子;

loopback 04的更多相关文章

  1. win8.1硬盘安装ubuntu14.04双系统

    在网上找了很多方法都失败了,原因是大多数方法都是用mbr方式安装的,如grub4dos,easybcd.以至于连自己都怀疑win8能不能用硬盘安装,差点就去买个u盘来安装了,就在打算放弃的时候在ubu ...

  2. VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT连接方式)

    背景 在虚拟机下运行操作系统,尤其是Linux系统已经是非常常见的做法.有时你想在虚拟机下搭建一个(模拟)服务器来供主机访问,比如搭建一个telnet/ssh.此时你会发现,每次启动虚拟机,VMWar ...

  3. windows10 下访问 virtualbox 虚拟机的linux15.10/16.04 系统 及 用 putty 访问虚拟机的配置

    参考: http://www.doc88.com/p-915707596190.html --- 安装samba http://my.oschina.net/u/2260265/blog/405598 ...

  4. VMware8.0虚拟机中安装Ubuntu12.04使用NAT设置连接网络

    之前一直尝试使用“桥接”的方法,但是一打开虚拟机,本机windows就断网.最后不得不换种方法,还好尝试了很多遍终于使用NAT设置成功的联网了. 说明:本机windows连接的是无线网. 1.检查自己 ...

  5. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  6. 服务器Ubuntu16.04下连接锐捷

    最近搞深度学习,老师买了一台服务器.双系统,win7和Ubuntu16.04,但是联网是遇到了问题. 输入ifconfig时,发现根本就找不到eth0和eth1,只有evp0s25和evp0s90,o ...

  7. Ubuntu 14.04 配置静态IP

    命令行手工配置静态IP比较麻烦,记录于此备查. 1,ubuntu的网络配置文件在: # /etc/network/interfaces //这个文件里 2,默认安装时,网络配置是使用DHCP自动分配I ...

  8. 在 Ubuntu 14.04 中配置 PXE 服务器

    PXE(预启动执行环境Preboot Execution Environment)服务器允许用户从网络中启动 Linux 发行版并且可以不需要 Linux ISO 镜像就能同时在数百台 PC 中安装. ...

  9. VMWare虚拟机下为Ubuntu 12.04.1配置静态IP_转

    转自:http://www.cnblogs.com/objectorl/archive/2012/09/27/vmware-ubuntu-nat-static-ip-settings.html 背景在 ...

随机推荐

  1. WCF服务跟踪

    如果在开发过程中,WCF服务出现问题,我们可以通过服务引用,然后直接断点调试进去.然而,对于已经发布的服务,出现错误时,寻找错误信息会变得麻烦. 幸好,微软提供了服务跟踪查看器工具 (SvcTrace ...

  2. 【leetcode】Binary Tree Right Side View(middle)

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  3. 零基础十分钟学会用git在coding.net上传(pull)和push

    ---恢复内容开始--- 对于入门者来说,特别是刚刚接触计算机的人来说,模仿是最快的学习方式了,先能够会使用(对于初学者来说,这种使用新事物的感觉很能爽的)至于原理,以后再说.下面先让初学者快速的学会 ...

  4. 解决git客户端MINGW32下的“Could not open a connection to your authentication agent.”

    使用git, 下载客户端后想进行和github 进行ssh 互通 出现以下情况: hadoop@deng-PC MINGW32 ~/.ssh$ ssh-add ~/.ssh/id_rsaCould n ...

  5. Vi 的基本使用

    一.Vi入门  Unix 提供了全屏幕的Vi编辑器,这使我们的工作轻松不少.不少DOS用户抱怨Vi编辑器不象DOS下的编辑器如edit那么好用,这 是因为Vi考虑到各种用户的需要,没有使用某些通用的编 ...

  6. JQ 全选设定与设置选中

    复选数据框 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  7. Android View -- setTranslationX

    通过此方法使View位置发生偏移,达到margin的作用却又不改变View的getLeft()的值. 恢复方法是setTranslationX(0),而不是上一次偏移量的相反数. 不过,通过getLo ...

  8. MVC缓存01,使用控制器缓存或数据层缓存

    对一些浏览频次多.数据量大的数据,使用缓存会比较好,而对一些浏览频次低,或内容因用户不同的,不太适合使用缓存.   在控制器层面,MVC为我们提供了OutputCacheAttribute特性:在数据 ...

  9. 如何减少JS的全局变量污染

    A,唯一变量 B,闭包

  10. STL Map的使用

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力.下面就通过示例记录一下map的使用: 一.向map中 ...