наследовать вложенный включаемый набор результатов родительский объект - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть несколько включений в одном запросе sequelize, но я не могу получить результат, как хочу. пожалуйста, смотрите ниже код

const users = await User.findAll({
  include: {
    model: Tool,
    as: 'Instruments',
    include: {
      model: Teacher,
      include: [ /* etc */ ]
    }
  }
});

вывод:

[{
  "name": "John Doe",
  "id": 1,
  "Instruments": [{ // 1:M and N:M association
    "name": "Scissor",
    "id": 1,
    "userId": 1,
    "Teacher": { // 1:1 association
      "name": "Jimi Hendrix"
    }
  }]
}]

теперь я хочу вывод как

    [{
      "name": "John Doe",
      "id": 1,
      "Instruments": { // 1:M and N:M association
        "name": "Scissor",
        "id": 1,
        "userId": 1
      },
      "Teacher": { // 1:1 association
        "name": "Jimi Hendrix"
      }
    }]

Возможно, если да, то как ??

1 Ответ

0 голосов
/ 04 февраля 2020

Как указано соотношение

ПОЛЬЗОВАТЕЛЬ (м) ------ (n) ИНСТРУМЕНТЫ (1) ------ (1 ) УЧИТЕЛЬ

Итак

  1. У каждого отдельного инструмента есть учитель, и каждый учитель обучает инструменту.
  2. Каждый пользователь может выучить несколько инструментов и каждый инструмент может изучать несколько пользователей.

На основании этих соотношений между USER и TEACHER следует

USER (m) - ---- (n) УЧИТЕЛЬ

  1. Каждый пользователь может учить инструмент у нескольких учителей.
  2. Каждый учитель может обучать инструмент многопользовательским.

Ваш исходный вывод был

[{
  "name": "John Doe",
  "id": 1,
  "Instruments": [{ // 1:M and N:M association
    "name": "Scissor",
    "id": 1,
    "userId": 1,
    "Teacher": { // 1:1 association
      "name": "Jimi Hendrix"
    }
  }]
}]

Что вы ожидаете, если есть несколько инструментов? как в случае с

[{
  "name": "John Doe",
  "id": 1,
  "Instruments": [{ // 1:M and N:M association
    "name": "Scissor",
    "id": 1,
    "userId": 1,
    "Teacher": { // 1:1 association
      "name": "Jimi Hendrix"
    }
  },
  {
    "name": "Guitar",
    "id": 2,
    "userId": 1,
    "Teacher": {
      "name": "john wick"
    }
  }]
}]

Если вы наберете instrument, то вы всегда можете опубликовать обработку своего результата после получения из sequelize.

const result = [{
  "name": "John Doe",
  "id": 1,
  "Instruments": [{ // 1:M and N:M association
    "name": "Scissor",
    "id": 1,
    "userId": 1,
    "Teacher": { // 1:1 association
      "name": "Jimi Hendrix"
    }
  },
  {
    "name": "Guitar",
    "id": 2,
    "userId": 1,
    "Teacher": {
      "name": "john wick"
    }
  }]
}]

console.log(result.map(function(obj) {
  return obj.Instruments.map(function(iObj) {
      const teacher = iObj.Teacher;
      delete iObj.Teacher;
      return {
        name: obj.name,
        id: obj.id,
        Instrument: iObj,
        Teacher: teacher
      }
    });
}).flat())
...