relations.js 4.74 KB
// Copyright IBM Corp. 2013,2016. All Rights Reserved.
// Node module: loopback-datasource-juggler
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
'use strict';

var DataSource = require('../index').DataSource;
var ds = new DataSource('memory');

var Order = ds.createModel('Order', {
  items: [String],
  orderDate: Date,
  qty: Number,
});

var Customer = ds.createModel('Customer', {
  name: String,
});

Order.belongsTo(Customer);

var order1, order2, order3;

Customer.create({name: 'John'}, function(err, customer) {
  Order.create({customerId: customer.id, orderDate: new Date(), items: ['Book']}, function(err, order) {
    order1 = order;
    order.customer(console.log);
    order.customer(true, console.log);

    Customer.create({name: 'Mary'}, function(err, customer2) {
      order.customer(customer2);
      order.customer(console.log);
    });
  });

  Order.create({orderDate: new Date(), items: ['Phone']}, function(err, order) {
    order.customer.create({name: 'Smith'}, function(err, customer2) {
      console.log(order, customer2);
      order.save(function(err, order) {
        order2 = order;
      });
    });

    var customer3 = order.customer.build({name: 'Tom'});
    console.log('Customer 3', customer3);
  });
});

Customer.hasMany(Order, {as: 'orders', foreignKey: 'customerId'});

Customer.create({name: 'Ray'}, function(err, customer) {
  Order.create({customerId: customer.id, qty: 3, orderDate: new Date()}, function(err, order) {
    order3 = order;
    customer.orders(console.log);
    customer.orders.create({orderDate: new Date(), qty: 4}, function(err, order) {
      console.log(order);
      Customer.include([customer], 'orders', function(err, results) {
        console.log('Results: ', results);
      });
      customer.orders({where: {qty: 4}}, function(err, results) {
        console.log('customer.orders', results);
      });
      customer.orders.findById(order3.id, console.log);
      customer.orders.destroy(order3.id, console.log);
    });
  });
});

var Physician = ds.createModel('Physician', {
  name: String,
});

var Patient = ds.createModel('Patient', {
  name: String,
});

var Appointment = ds.createModel('Appointment', {
  physicianId: Number,
  patientId: Number,
  appointmentDate: Date,
});

Appointment.belongsTo(Patient);
Appointment.belongsTo(Physician);

Physician.hasMany(Patient, {through: Appointment});
Patient.hasMany(Physician, {through: Appointment});

Physician.create({name: 'Dr John'}, function(err, physician1) {
  Physician.create({name: 'Dr Smith'}, function(err, physician2) {
    Patient.create({name: 'Mary'}, function(err, patient1) {
      Patient.create({name: 'Ben'}, function(err, patient2) {
        Appointment.create({
          appointmentDate: new Date(),
          physicianId: physician1.id,
          patientId: patient1.id,
        }, function(err, appt1) {
          Appointment.create({
            appointmentDate: new Date(),
            physicianId: physician1.id,
            patientId: patient2.id,
          }, function(err, appt2) {
            physician1.patients(console.log);
            physician1.patients({where: {name: 'Mary'}}, console.log);
            patient1.physicians(console.log);

            // Build an appointment?
            var patient3 = patient1.physicians.build({name: 'Dr X'});
            console.log(
              'Physician 3: ',
              patient3,
              patient3.constructor.modelName
            );

            // Create a physician?
            patient1.physicians.create(
              {name: 'Dr X'},
              function(err, patient4) {
                console.log(
                  'Physician 4: ',
                  patient4,
                  patient4.constructor.modelName
                );
              }
            );
          });
        });
      });
    });
  });
});

var Assembly = ds.createModel('Assembly', {
  name: String,
});

var Part = ds.createModel('Part', {
  partNumber: String,
});

Assembly.hasAndBelongsToMany(Part);
Part.hasAndBelongsToMany(Assembly);

Assembly.create({name: 'car'}, function(err, assembly) {
  Part.create({partNumber: 'engine'}, function(err, part) {
    assembly.parts.add(part, function(err) {
      assembly.parts(function(err, parts) {
        console.log('Parts: ', parts);
      });

      // Build an part?
      var part3 = assembly.parts.build({partNumber: 'door'});
      console.log('Part3: ', part3, part3.constructor.modelName);

      // Create a part?
      assembly.parts.create({partNumber: 'door'}, function(err, part4) {
        console.log('Part4: ', part4, part4.constructor.modelName);

        Assembly.find({include: 'parts'}, function(err, assemblies) {
          console.log('Assemblies: ', assemblies);
        });
      });
    });
  });
});