Góp ý ý tưởng về chức năng LIKE bài viết và comment trong Laravel.
Một câu hỏi mà em rất muốn nhận được sự góp ý của các bạn, anh, chị trong Group. Đây là sự góp ý, vì e cũng có ý tưởng, nhưng e sợ ý tưởng của e không được hay và tối ưu nên e muốn hỏi để tối ưu ý tưởng của mình ạ.
Ý là em chuẩn bị làm chức năng like cho comment và bài viết, và vấn đề gặp phải ở đây là: “Làm thế nào để nhận dạng được người nào đã LIKE bài viết hoặc đã LIKE comment, để có thể disable nút LIKE đi ở phía Client ấy ạ..
Ý tưởng của e có thể hơi củ chuối 1 chút, nên nếu anh chị bạn nào có ý tưởng hay hơn có thể chia sẻ cho e học hỏi ạ..
My idea: Vì một bài viết, comment có mỗi quan hệ N- N
với bảng Users
nên e sẽ tạo một bảng phụ có tên là comment_user
, posts_user
và query như bình thường ạ, nếu xét có user
đang đăng nhập trùng với 1 user_id
ở 2 bảng trên thì chứng tỏ có LIKE rồi..
Đó là ý tưởng củ chuối của em, và giờ kg biết có ý tưởng nào hay hơn không ạ? Như là lưu thông tin người LIKE ở server chẳng hạn ạ, lưu vào 1 array
rồi duyệt.. Nhưng e chưa biết cách này…
E xin cám ơn ạ
1 CÂU TRẢ LỜI
My idea: Vì một bài viết, comment có mỗi quan hệ
N- N
với bảngUsers
nên e sẽ tạo một bảng phụ có tên làcomment_user
,posts_user
và query như bình thường ạ, nếu xét cóuser
đang đăng nhập trùng với 1user_id
ở 2 bảng trên thì chứng tỏ có LIKE rồi..
Anh không hiểu rõ chỗ này của em lắm. Bài viết và comment là có quan hệ 1 - n
với user (1 bài viết, hay 1 comment chỉ thuộc về 1 user, 1 user có nhiều bài viết hay comment), chứ sao lại quan hệ n - n
được
Để thực hiện chức năng LIKE, ta cần một bảng trung gian giữa user
và post
, cũng như user
và comment
. Em nên dùng Polymorphic Relations trong trường hợp này, khi đó chỉ cần có một bảng trung gian, gọi là likes
chẳng hạn.
Bảng likes
sẽ có cấu trúc như sau:
likes
id - integer
user_id - integer
likeable_id - integer
likeable_type - string
mỗi khi users like một comment, hay post, thì em insert một bản ghi vào trong bảng likes
ở trên, như vậy sẽ lưu được thông tin về việc ai đã từng like những cái gì. Ví dụ như em có 2 bản ghi:
1, 2, 3, "COMMENT" // => user 2, like comment có id là 3
2, 3, 4, "POST" // => user 3, like post có id là 4
Laravel có support sẵn khai báo và query Polymorphic Relations rồi nên implement cũng rất dễ em ạ
E hiểu ý a ạ... nhưng e chưa tìm hiểu được Polymorphic Relations đó ạ? A có thể nói cụ thể hơn xíu được không ạ?
Thêm 1 ý là e chưa biết cách check xem thử 1 user đã like comment, hoặc post hay chưa ạ?...
@minhtuancnttk39 Về Polymorphic Relations, hay dịch ra là quan hệ đa hình, em có thể tham khảo một vài bài viết dưới đây trên Viblo, trong đó có những ví dụ cụ thể sẽ giúp em hiểu rõ hơn
- https://viblo.asia/p/eloquent-relationships-in-laravel-53-chap-1-rQOvPNlyeYj#_polymorphic-relations-quan-he-da-hinh-4
- https://viblo.asia/p/laravel-eloquent-orm-part-2-DljMbVo5MVZn
- https://viblo.asia/p/eloquent-relationships-in-laravel-phan-2-aRBvXWEokWE
Còn làm thế nào để check xem thử 1 user đã like comment, hoặc post hay chưa?, thì rất đơn giản, em check xem có record trong bảng likes
hay chưa.
Ví dụ check xem user có id là 3
đã like comment có id là 4
hay chưa thì em chỉ cần query kiểu như sau
select * from likes where user_id = 3 and likeable_id = 4 and likeable_type = 'App\Model\Comment' limit 1;
nếu có record thì chứng tỏ like rồi, còn chưa có thì tức là chưa like Bởi khi người dùng like, em sẽ tạo thêm 1 record với nội dung kiểu như ở trên, còn ghi người dùng unlike, em sẽ xoá record đấy đi
Yeppp, e làm được rồi, lúc ngủ e suy nghĩ xong cái dậy code..
Đã thành công rồi ạ...
Đoạn đường e làm cái website này, luôn có anh và các anh trên Viblo cùng đồng hành...
@minhtuancnttk39 Cố gắng lên em nhé
Có gì cứ lên Viblo đặt câu hỏi, mọi người sẽ giúp đỡ mà