Hello, I have read this post, but I cant get every comment count user likes.
my comment Schema:
schema "comments" do
field(:description, :string, null: false)
field(:section_id, :binary_id, null: false)
belongs_to :users, User, foreign_key: :user_id, type: :binary_id
has_many :comments_likes, CommentLike, foreign_key: :comment_id
timestamps(type: :utc_datetime)
end
and my comment like Schema:
schema "comments_likes" do
belongs_to :users, User, foreign_key: :user_id, type: :binary_id
belongs_to :comments, Comment, foreign_key: :comment_id, type: :binary_id
timestamps(type: :utc_datetime)
end
now I want to show all the comments with their likes counted, the query I have written:
def comments(section_id, condition: %{paginate: {page, page_size}}) do
from(com in Comment,
where: com.section_id == ^section_id,
join: user in assoc(com, :users),
left_join: like in subquery(likes()),
select: %{
id: com.id,
description: com.description,
......
user_username: user.username,
like: like
})
|> MishkaDatabase.Repo.paginate(page: page, page_size: page_size)
end
def likes() do
from like in CommentLike,
group_by: like.user_id,
select: %{count: count(like.id)}
end
As you can see in the code above, I create a subquery to count comment likes, but the result I have is duplicate and the counter is no true:
[
%{
description: "this is a test comment we need",
id: "e81a61db-6fa2-4e3c-b592-71a8341ef1e7",
like: %{count: 1},
...
user_username: "user1"
},
%{
description: "this is a test comment we need",
id: "e81a61db-6fa2-4e3c-b592-71a8341ef1e7",
like: %{count: 1},
priority: :none,
...
user_username: "user1"
},
%{
description: "test 2",
id: "930f3efd-05d5-4d3f-b9df-a69812856184",
like: %{count: 1},
...
user_username: "user2"
},
%{
description: "test 2",
id: "930f3efd-05d5-4d3f-b9df-a69812856184",
like: %{count: 1},
...
user_username: "user2"
}
]
I am using
scrivener_ecto
.
Thanks