Как вывести кол-во лайков записи через scope в sequelize?

Рейтинг: 0Ответов: 1Опубликовано: 13.02.2023

Есть запрос на получение записей:

await Post.scope('likeCount').findAndCountAll({...})

В ней scope на получение количества лайков данной записи

{
    scopes: {
        likeCount: {
            // attributes: [[sequelize.fn('COUNT', sequelize.col('likePosts.id')), 'likeCount']], // Пробовал так, но ничего не получилось
            include: {
                model: LikePost,
            },
        },
    },
}

Вывод данного кода в таком виде (Как видно просто выводится массив всех найденных лайков).

Вопрос в топ, как вывести количество найденных лайков, а не список.

Выше я пробовал подставлять через attributes но выводит ошибку "likePosts нет в FORM". На выходе такой запрос выходит:

SELECT "post".*, "likePosts"."id" AS "likePosts.id", "likePosts"."userId" AS "likePosts.userId", "likePosts"."createdAt" AS "likePosts.createdAt", "likePosts"."updatedAt" AS "likePosts.updatedAt", "likePosts"."commentPostId" AS "likePosts.commentPostId", "likePosts"."postId" AS "likePosts.postId" FROM (SELECT "post"."id", COUNT("likePosts") AS "likeCount" FROM "posts" AS "post" WHERE "post"."userId" IN ('1', '2') ORDER BY "post"."id" DESC LIMIT 3 OFFSET 0) AS "post" LEFT OUTER JOIN "likePosts" AS "likePosts" ON "post"."id" = "likePosts"."postId" ORDER BY "post"."id" DESC

Пробовал по всякому, менял названия и т д. Несколько часов потрачено в пустую.

[
    {
        "id": "1",
        "description": null,
        "topicId": null,
        "ageLimit": 0,
        "type": "public",
        "accessСomment": "public",
        "isPinned": false,
        "quizId": null,
        "blockedId": null,
        "countryId": null,
        "regionId": null,
        "cityId": null,
        "streetId": null,
        "lang": null,
        "status": true,
        "createdAt": "2023-02-13T07:25:19.785Z",
        "updatedAt": "2023-02-13T07:25:19.785Z",
        "userId": "1",
        "likePosts": [
            {
                "id": "4",
                "userId": 1,
                "createdAt": "2023-01-14T17:56:09.242Z",
                "updatedAt": "2023-01-14T17:56:09.242Z",
                "commentPostId": null,
                "postId": "1"
            },
            {
                "id": "5",
                "userId": 1,
                "createdAt": "2023-01-14T17:56:09.242Z",
                "updatedAt": "2023-01-14T17:56:09.242Z",
                "commentPostId": null,
                "postId": "1"
            }
        ]
    }
]

Ответы

▲ 0

Нашел только такой вариант решения, не красиво. Если найдется что то лучше, буду рад получить ответ.

attributes: {
                include: [
                    [
                        sequelize.literal(`(
                        SELECT COUNT(*)
                        FROM "likePosts" AS likePost
                        WHERE
                        likePost."postId" = post.id
                    )`),
                        'likeCount',
                    ],
                ],
            },