Сортировка на основе созданной таблицы соединений во многих ко многим - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть две модели с many-to-many ассоциацией между ними.

JobPosts
----------------
id | 

Student
----------------
id |


JobPosts_Applied
------------------
id | StudentId | JobPostId

Ниже определена ассоциация.

 JobPosts.belongsToMany(models.Student, {
      through: "JobPosts_Applied",
      as: "students"
    });

Student.belongsToMany(models.JobPosts, {
            through: 'JobPosts_Applied'
    });

Я пытаюсь получить все оглушения вместе с JobPost. Но students должно быть отсортировано по createdAt из applied.

const post = await JobPosts.findAll({
          limit: 5,
          include: [
            {
              model: Student,
              through: {
                model: JobPosts_Applied,
                as: 'applied',
                attributes: ['createdAt']
              },
              as: 'students',
              attributes: ['name']
            },
          ],
          order: [
            ['createdAt', 'DESC'],
            ['applied', 'createdAt', 'DESC']
          ],
          logging: console.log
        });

Но это не работает, не сортируется массив students на основании JobPosts_Applied.createdAt.

Создает этот запрос:

SELECT "JobPosts".*, "students"."id" AS "students.id", "students"."name" AS "students.name", "students->applied"."createdAt" AS "students.applied.createdAt", "students->applied"."updatedAt" AS "students.applied.updatedAt", "students->applied"."StudentId" AS "students.applied.StudentId", "students->applied"."JobPostId" AS "students.applied.JobPostId"
FROM (
SELECT "JobPosts"."id", "JobPosts"."postedby", "JobPosts"."location", "JobPosts"."details", "JobPosts"."image", "JobPosts"."contact", "JobPosts"."video", "JobPosts"."interview_date", "JobPosts"."services", "JobPosts"."comment_count", "JobPosts"."is_authenticated", "JobPosts"."visible_to_all", "JobPosts"."no_of_shares", "JobPosts"."no_of_applications", "JobPosts"."createdAt", "JobPosts"."updatedAt", "JobPosts"."InstituteId", "JobPosts"."EmployerId", "JobPosts"."MemberId"
FROM "JobPosts" AS "JobPosts"
ORDER BY "JobPosts"."createdAt" DESC, "JobPosts"."applied"."createdAt" DESC
LIMIT 5) AS "JobPosts"
LEFT OUTER
JOIN ("JobPosts_Applied" AS "students->applied"
INNER JOIN "Students" AS "students" ON "students"."id" = "students->applied"."StudentId") ON "JobPosts"."id" = "students->applied"."JobPostId"
ORDER BY "JobPosts"."createdAt" DESC, "JobPosts"."applied""createdAt" DESC;

Я также пытался передать order: [['createdAt', 'DESC']] внутри включенной модели JobPosts_Applied, внутри through. Но он также не возвращает отсортированный результат.

Обновление

[
  {
    "id": 123,
   "description": "some desc",
   "students": [
     {
      "name": "bill",
       "applied": {
          "createdAt": "10-09-2019 09:10:22"
        }
     },
     {
      "name": "michelle",
       "applied": {
          "createdAt": "10-29-2019 09:10:22"
        }
     }
     ...
     ]
     }
   },
   {
   "id": 1233,
   "description": "some desc",
   "students": [
     {
     "name": "mike",
      "applied": {
          "createdAt": "10-10-2019 09:10:22"
        }
     },
     {
     "name": "ruby",
      "applied": {
          "createdAt": "10-20-2019 09:10:22"
        }
     }
     ...
    ]
  }
 ...
]

Что я хочу, чтобы массив students был отсортирован в порядке убывания по дате они applied(createdAt) для работы.

Таким образом, последний студент, подавший заявку на работу, занимает первое место в массиве students.

...