Список внутри списка внутри списка с sequelize и postgresql - PullRequest
0 голосов
/ 05 августа 2020

Я хочу видеть все содержимое во всех темах во всех дисциплинах с помощью этого кода:

UserDisciplineModel.findAll({
        logging: console.log,
        duplicating: false,
        include: [{
          model: Discipline,
          required: true,
          attributes: ['id','name','description'],
          include: [{
            model: Topic,
            required: true,
            attributes: ['id','name','description'],
            include: [{
              model: Content, 
              required: true,
              attributes: ['id','name','description'],
            }] 
          }] 
        }],
        where: {id_user: id_user}
      });

Но я получаю только 1 контент в 1 топи c по каждой из всех дисциплин, например в этом ответе:

[
    {
        "id": 2,
        "id_user": 1,
        "id_discipline": 2,
        "status": null,
        "agreement": {},
        "createdAt": "2020-08-03T04:11:50.849Z",
        "updatedAt": "2020-08-03T04:11:50.849Z",
        "disciplines": [
            {
                "id": 2,
                "name": "Discipline Example 2",
                "description": "Description Discipline Example 2",
                "topic": {
                    "id": 4,
                    "name": "Topic 2 Disc 2",
                    "description": "description",
                    "content": {
                        "id": 6,
                        "name": "content1topic2",
                        "description": "desccontent1topic2"
                    }
                }
            }
        ]
    },
    {
        "id": 1,
        "id_user": 1,
        "id_discipline": 1,
        "status": null,
        "agreement": {},
        "createdAt": "2020-08-04T04:11:50.849Z",
        "updatedAt": "2020-08-04T04:11:50.849Z",
        "disciplines": [
            {
                "id": 1,
                "name": "Discipline Example 1",
                "description": "Description Discipline Example 1",
                "topic": {
                    "id": 3,
                    "name": "Example Topic 3 Discipline 1",
                    "description": "Any description",
                    "content": {
                        "id": 3,
                        "name": "Example Content 2 Topic 1 Discipline 1",
                        "description": "Description right here"
                    }
                }
            }
        ]
    }
]

Итак ... Когда я запускаю, Sequelize сгенерирует это sql:

FROM "user_disciplines" AS "user_discipline" INNER JOIN "disciplines" AS "disciplines" ON "user_discipline"."id_discipline" = "disciplines"."id" INNER JOIN "topics" AS "disciplines->topic" ON "disciplines"."id" = "disciplines->topic"."id_discipline" INNER JOIN "contents" AS "disciplines->topic->content" ON "disciplines->topic"."id" = "disciplines->topic->content"."id_topic" WHERE "user_discipline"."id_user" = 1;

Кажется, все в порядке, но, разговаривая с другом, я замечаю что, возможно, мне нужно будет использовать что-то вроде подзапроса (не уверен).

Итак, мне нужен список внутри списка внутри списка. Мой идеальный ответ был бы таким:

"disciplines": [
           {
             "id": 1,
             "name": "Discipline Example 1",
             "description": "Description Discipline Example 1",
             "topics": [
               {
                 "id": 1,
                 "name": "Example Topic 1 Discipline 1",
                 "description": "Any description",
                 "id_discipline": 1,
                 "contents": [
                   {
                     "id": 1,
                     "name": "Example Content 1 Topic 1 Discipline 1",
                     "description": "Description example",
                     "id_topic": 1,
                   },
                   {
                     "id": 7,
                     "name": "Example Content 2 Topic 1 Discipline 1",
                     "description": "Description Any!",
                     "id_topic": 1,
                   }
                 ]
               },
               {
                 "id": 2,
                 "name": "Example Topic 2 Discipline 1",
                 "description": "Any Description to this topic",
                 "id_discipline": 1,
                 "contents": []
               },
               {
                 "id": 3,
                 "name": "Example Topic 3 Discipline 1",
                 "description": "Any description",
                 "id_discipline": 1,
                 "contents": [
                   {
                     "id": 2,
                     "name": "Example Content 1 Topic 3 Discipline 1",
                     "description": "Example Description",
                     "id_topic": 3,
                   },
                   {
                     "id": 3,
                     "name": "Example Content 2 Topic 1 Discipline 1",
                     "description": "Description right here",
                     "id_topic": 3,
                   }
                 ]
               }
             ]
           },
           {
             "id": 2,
             "name": "Discipline Example 2",
             "description": "Description Discipline Example 2",
             "topics": [
               {
                 "id": 5,
                 "name": "Topic 1 Disc 2",
                 "description": "Description Topic Example",
                 "id_discipline": 2,
                 "contents": [
                   {
                     "id": 4,
                     "name": "Content1",
                     "description": "desccont1",
                     "id_topic": 5,
                   },
                   {
                     "id": 5,
                     "name": "Content2",
                     "description": "desccont2",
                     "id_topic": 5,
                   }
                 ]
               },
               {
                 "id": 4,
                 "name": "Topic 2 Disc 2",
                 "description": "description",
                 "id_discipline": 2,
                 "contents": [
                   {
                     "id": 6,
                     "name": "content1topic2",
                     "description": "desccontent1topic2",
                     "id_topic": 4,
                     "id_author": 1,
                     "icon": "pe-7s-hourglass icon-gradient bg-grow-early",
                     "createdAt": "2020-08-05T18:14:28.710Z",
                     "updatedAt": "2020-08-05T18:14:28.710Z"
                   }
                 ]
               }
             ]
           }
         ]

Объясните проект:

Я использую Sequelize, Node.js и PostgreSQL базу данных.

В этом В данном случае у меня есть 5 таблиц:

Пользователь, Дисциплина, Топи c, Контент, Пользователь_Дисциплина

Многие материалы содержат по одной теме. У многих тем одна дисциплина. Дисциплина таблиц -> Topi c (topi c .id_discipline) -> Content (content.id_topi c), все связаны внешними ключами. (ОДИН ДО МНОГИХ)

Таблица User_Discipline связывает пользователя и дисциплины, у многих пользователей может быть много дисциплин. (user_discipline.user_id, user_discipline.discipline_id) (МНОГО ДО МНОГО)

...