Я не могу придумать заголовок, поэтому позвольте мне объяснить проблему:
Проблема: Я хочу вернуть массив сообщений с каждым сообщением, содержащим количество лайков. Счет лайков предназначен для специфика c поста , но для всех пользователей, которым он понравился
Например:
const posts = [
{
post_id: 1,
like_count: 100
},
{
post_id: 2,
like_count: 50
}
]
сейчас с моим текущим решением я не думаю, что это возможно, но вот что у меня есть.
Мой запрос в настоящее время выглядит следующим образом (произведенный TypeORM):
SELECT
"p"."uid" AS "p_uid",
"p"."created_at" AS "post_created_at",
"l"."uid" AS "like_uid",
"l"."post_liked" AS "post_liked",
"ph"."path" AS "path",
"ph"."title" AS "photo_title",
"u"."name" AS "post_author",
(
SELECT
COUNT(like_id) AS "like_count"
FROM
"likes" "l"
INNER JOIN
"posts" "p"
ON "p"."post_id" = "l"."post_id"
WHERE
"l"."post_liked" = true
AND l.post_id = $1
)
AS "like_count"
FROM
"posts" "p"
LEFT JOIN
"likes" "l"
ON "l"."post_id" = "p"."post_id"
INNER JOIN
"photos" "ph"
ON "ph"."photo_id" = "p"."photo_id"
INNER JOIN
"users" "u"
ON "u"."user_id" = "p"."user_id"
At $1
- это то место, где post.post_id
должен go (но ради тестирования я вставил туда первый пост), предполагая, что у меня есть готовый для размещения массив post_ids.
Мой TypeORM запрос выглядит следующим образом:
async findAll(): Promise<Post[]> {
return await getRepository(Post)
.createQueryBuilder('p')
.select(['p.uid'])
.addSelect(subQuery =>
subQuery
.select('COUNT(like_id)', 'like_count')
.from(Like, 'l')
.innerJoin('l.post', 'p')
.where('l.post_liked = true AND l.post_id = :post_id', {post_id: 'a16f0c3e-5aa0-4cf8-82da-dfe27d3f991a'}), 'like_count'
)
.addSelect('p.created_at', 'post_created_at')
.addSelect('u.name', 'post_author')
.addSelect('l.uid', 'like_uid')
.addSelect('l.post_liked', 'post_liked')
.addSelect('ph.title', 'photo_title')
.addSelect('ph.path', 'path')
.leftJoin('p.likes', 'l')
.innerJoin('p.photo', 'ph')
.innerJoin('p.user', 'u')
.getRawMany()
}
Почему я это делаю? Чего я пытаюсь избежать, так это набираю count
для каждого поста на моей странице, чтобы вернуть количество лайков для каждый пост. Я думал, что смогу как-то сделать это в подзапросе, но теперь я не уверен, возможно ли это.
Может кто-нибудь предложить более эффективный способ сделать что-то подобное? Или этот подход совершенно неправильный?