UNPKG

3.22 kBJavaScriptView Raw
1// Copyright IBM Corp. 2013,2019. All Rights Reserved.
2// Node module: loopback-datasource-juggler
3// This file is licensed under the MIT License.
4// License text available at https://opensource.org/licenses/MIT
5
6'use strict';
7
8const DataSource = require('../../loopback-datasource-juggler').DataSource;
9const ModelBuilder = require('../../loopback-datasource-juggler').ModelBuilder;
10const ds = new DataSource('memory');
11
12// define models
13const Post = ds.define('Post', {
14 title: {type: String, length: 255},
15 content: {type: DataSource.Text},
16 date: {type: Date, default: function() {
17 return new Date;
18 }},
19 timestamp: {type: Number, default: Date.now},
20 published: {type: Boolean, default: false, index: true},
21});
22
23// simplier way to describe model
24const User = ds.define('User', {
25 name: String,
26 bio: DataSource.Text,
27 approved: Boolean,
28 joinedAt: Date,
29 age: Number,
30});
31
32const Group = ds.define('Group', {name: String});
33
34// define any custom method
35User.prototype.getNameAndAge = function() {
36 return this.name + ', ' + this.age;
37};
38
39const user = new User({name: 'Joe'});
40console.log(user);
41
42// console.log(ds.models);
43// console.log(ds.definitions);
44
45// setup relationships
46User.hasMany(Post, {as: 'posts', foreignKey: 'userId'});
47
48// creates instance methods:
49// user.posts(conds)
50// user.posts.build(data) // like new Post({userId: user.id});
51// user.posts.create(data) // build and save
52
53Post.belongsTo(User, {as: 'author', foreignKey: 'userId'});
54// creates instance methods:
55// post.author(callback) -- getter when called with function
56// post.author() -- sync getter when called without params
57// post.author(user) -- setter when called with object
58
59User.hasAndBelongsToMany('groups');
60
61const user2 = new User({name: 'Smith', age: 14});
62user2.save(function(err) {
63 console.log(user2);
64 const post = user2.posts.build({title: 'Hello world'});
65 post.save(function(err, data) {
66 console.log(err ? err : data);
67 });
68});
69
70Post.findOne({where: {published: false}, order: 'date DESC'}, function(err, data) {
71 console.log(data);
72});
73
74User.create({name: 'Jeff', age: 12}, function(err, data) {
75 if (err) {
76 console.log(err);
77 return;
78 }
79 console.log(data);
80 const post = data.posts.build({title: 'My Post'});
81 console.log(post);
82});
83
84User.create({name: 'Ray'}, function(err, data) {
85 console.log(data);
86});
87
88User.scope('minors', {where: {age: {lte: 16}}, include: 'posts'});
89User.minors(function(err, kids) {
90 console.log('Kids: ', kids);
91});
92
93const Article = ds.define('Article', {title: String});
94const Tag = ds.define('Tag', {name: String});
95Article.hasAndBelongsToMany('tags');
96
97Article.create(function(e, article) {
98 article.tags.create({name: 'popular'}, function(err, data) {
99 Article.findOne(function(e, article) {
100 article.tags(function(e, tags) {
101 console.log(tags);
102 });
103 });
104 });
105});
106
107// should be able to attach a data source to an existing model
108const modelBuilder = new ModelBuilder();
109
110const Color = modelBuilder.define('Color', {
111 name: String,
112});
113
114// attach
115ds.attach(Color);
116
117Color.create({name: 'red'});
118Color.create({name: 'green'});
119Color.create({name: 'blue'});
120
121Color.all(function(err, colors) {
122 console.log(colors);
123});
124