Получение данных из нескольких таблиц из Sequelize - PullRequest
0 голосов
/ 06 января 2019

Как лучше всего получить данные, не связанные напрямую с моделью

У меня есть фреймворк для отслеживания приложений, установленных на устройствах. На устройстве может быть установлено несколько приложений, а приложения могут быть на нескольких устройствах. Каждое устройство принадлежит одному или нескольким проектам, и проекты могут иметь несколько устройств. Каждый проект принадлежит пользователю.

Теперь, если я ищу проект, я могу включить устройство и пользователя, но не приложения, так как они принадлежат устройству. Я новичок в Sequelize, поэтому, возможно, упускаю что-то простое! Когда я выполняю запрос к проекту, могу ли я так же легко получить приложения, принадлежащие устройству? Или мне нужно создавать ассоциации между проектом и приложениями, которые мне не кажутся правильными, или выполнять какой-то вложенный поиск?

Надеюсь, это имеет смысл!

Спасибо

const Sequelize = require('sequelize')
const UserModel = require('./models/user')
const projectModel = require('./models/project')
const deviceModel = require('./models/device')
const applicationModel = require('./models/application')

const{user, host, database, userdatabase, password, port} = require('./secrets/db_configuration');

function propagateRequired(modelDescriptor) {
    let include = modelDescriptor.include;

    if (!include) return false;
    if (!Array.isArray(include)) include = [include];

    return include.reduce((isRequired, descriptor) => {
      const hasRequiredChild = propogateRequired(descriptor);
      if ((descriptor.where || hasRequiredChild) && descriptor.required === undefined) {
        descriptor.required = true;
      }
      return descriptor.required || isRequired;
    }, false);
}

const sequelize = new Sequelize(userdatabase, user, password, {
    host: host,
    port: port,
    dialect: 'postgres',
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    // 
http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
    define: {
        hooks: {
          // beforeFind: propagateRequired
        }
      },
    operatorsAliases: false
  });

const User = UserModel(sequelize, Sequelize)
const ProjectDevice = sequelize.define('project_device', {})
const DeviceApplication = sequelize.define('device_application', {})
const Project = projectModel(sequelize, Sequelize)
const Device = deviceModel(sequelize, Sequelize)
const Application = applicationModel(sequelize, Sequelize)

Application.belongsToMany(Device, { through: DeviceApplication, unique: false})
Device.belongsToMany(Application, { through: DeviceApplication, unique: false})
Project.belongsToMany(Device, { through: ProjectDevice, unique: false})
Device.belongsToMany(Project, { through: ProjectDevice, unique: false})
Project.belongsTo(User)

sequelize.sync({ force: false })
  .then(() => {
    console.log(`Database & tables created!`)
  })

module.exports = {
  User,
  Application,
  Device,
  Project
}

index.js

const express = require('express')
const bodyParser = require('body-parser')
const { User,Project,Device,Application } = require('./sequelize')

const app = express()
app.use(bodyParser.json())


// create a user
app.post('/api/users', (req, res) => {
    console.log(req.body)
    User.create(req.body)
        .then(user => res.json(user))
})
// get all users
app.get('/api/users', (req, res) => {
    User.findAll().then(users => res.json(users))
})

// find project 
app.get('/api/project/:project?', (req, res) => {
    let query;
    if(req.params.project) {
        query = Project.findAll({ where: { id: req.params.project},
            include: [
            { model: Device },
            { model: User }
        ]})
    } else {
        query = Project.findAll({ include: [Device, User]})
    }
    return query.then(devices => res.json(devices))
})

// find device
app.get('/api/device/:device?', (req, res) => {
    let query;
    if(req.params.device) {
        query = Device.findAll({ where: { id: req.params.device },
            include: [
            { model: Application }
        ]})
    } else {
        query = Project.findAll({ include: [Application]})
    }
    return query.then(devices => res.json(devices))
})

// find app
app.get('/api/application/:application?', (req, res) => {
    let query;
    if(req.params.application) {
        query = Application.findAll({ where: { id: req.params.application }, 
            include: [
            { model: Device }
        ]})
    } else {
        query = Project.findAll({ include: [Device, User]})
    }
    return query.then(devices => res.json(devices))
})

const port = 3000
app.listen(port, () => {
    console.log(`Running on http://localhost:${port}`)
})
...