Vấn đề nhỏ về query builder trong laravel.
- Em chào mọi người, hôm nay e gặp một tình huống rất khó nghĩ ạ, không biết tại tư duy e kém hay là tại kinh nghiệm chưa có mà e vẫn chưa suy nghĩ được cách giải quyết bài toán e đề ra ạ.
- Ý là nó như thế này ạ: "Trong 1 bài viết, e chỉ đăng bài dựa trên Tag(s) chứ có có Category(s) ạ. Vì thế nên bài toán mới rắc rối. Giờ e muốn khi e show up bài viết của e lên trang web, thì cuối bài viết, e muốn nó hiện thị thêm 4 bài viết liên quan (related) ấy ạ... Nhưng khổ cái là bảng posts và bảng tags e quan hệ nhiều nhiều (Many to Many relationship) nên có 1 pivot table là post_tags giữa chúng. (Mục đích là như viblo ấy ạ)
- Ví dụ bài viết của e có 3 tag(s) thì e hiện thì 3 bài, mỗi bài 1 tag của bài viết hiện đang xem. Ngược lại, nếu 2 tag(s) thì e lấy tag đầu tiên 2 bài, tag cuối 1 bài. Còn nếu 1 tag thì e lấy tag đó 3 bài...
- Ý e kg hỏi cụ thể phải viết như thế nào. Nhưng e hỏi cách query nó như thế nào cho hiệu quả và sau này nhìn vào có thể matin được ấy ạ. E cám ơn anh/chị ạ.
1 CÂU TRẢ LỜI
Bài toán này thực tế nếu em xử lý không khéo thì sẽ còn gặp khá nhiều vấn đề khác như:
Ví dụ bài viết của e có 3 tag(s) thì e hiện thì 3 bài, mỗi bài 1 tag của bài viết hiện đang xem
Nếu 1 trong 3 tags đó chỉ có duy nhất 1 bài (là bài em đang viết) thì sẽ ra sao, hay có những bài thuộc về 2 (hay cả 3) tag đó được select ra thì tính vào cho tag nào?
Ngược lại, nếu 2 tag(s) thì e lấy tag đầu tiên 2 bài, tag cuối 1 bài. Còn nếu 1 tag thì e lấy tag đó 3 bài...
Nếu tag đầu tiên không có đủ 2 bài để em select ra thì sao ...
Nếu như em giới hạn số tag là 4 (như ở phần comment em có đề cập ở trên), thì anh nghĩ có thể thực hiện theo cách chạy vòng for
với từng tag, để lấy ra 3 bài viết (em có thể sắp xếp theo thời gian tạo bài viết khi thực hiện phép select này nếu muốn) đối với từng tag đó. Sau đó em chạy thêm vòng for
để duyệt qua các kết quả trả về, mỗi lần lấy từ mảng ra 1 phần tử để đưa vào danh sách bài viết related mà em mong muốn, break vòng lặp khi em đã có đủ số bài mong muốn (3 chẳng hạn)
Hoặc em có thể đi theo một hướng giải quyết khác là làm đơn giản yêu cầu đi, để có được giải pháp đơn giản hơn Chỉ cần bỏ cái yêu cầu mỗi tag lấy một bài đi là mọi thứ dễ dàng hơn rất nhiều, chỉ cần select top 3 bài mà có tag_id
nằm trong tập các tag_id
của bài viết hiện tại là được.
Dạ, e vẫn chưa biết cách select a nói nó như thế nào hết ạ, được biết a cũng master laravel nên cho e hỏi cách nó như thế nào được kg ạ. Tại e đang học và tìm hiểu ở Documentation của laravel.
- Mong a giải thích ạ.
@thangtd90 Em làm được rồi a ạ... Như a nói thế ạ. Không làm rườm rà như cách e nghĩ ra nữa.. Tự làm khó bản thân.
Còn về việc select ra thế nào thì em có thể dùng relations
trong Laravel, em có thể xem thêm document về quan hệ many-to-many tại trang chủ của Laravel
hoặc các bài trên Viblo:
- https://viblo.asia/p/eloquent-relationships-in-laravel-phan-1-PdbGnoEdeyA
- https://viblo.asia/p/eloquent-relationships-in-laravel-phan-2-aRBvXWEokWE
- https://viblo.asia/p/eloquent-relationships-in-laravel-phan-3-MJykjmxyePB
- https://viblo.asia/p/eloquent-relationships-in-laravel-53-chap-1-rQOvPNlyeYj
- https://viblo.asia/p/eloquent-relationships-in-laravel-53-chap-2-aRBvXnwJeWE
- https://viblo.asia/p/eloquent-relationships-in-laravel-53-chap-3-DZrGNDmjkVB
@thangtd90 Dạ, e cám ơn a ạ...
Nếu bài viết bạn có 100 tag thì bạn sẽ định lấy bài viết liên quan như nào nhỉ?
Chắc là bạn đang muốn mục Bài viết liên quan chỉ hiển thị 3 bài viết được lấy dựa trên tags?
@huukimit Dạ, đúng rồi a ạ.. Tối đa e chỉ cho 4 tags thôi a ạ... Nên e đang thắc mắc thế đó ạ. Với thêm 1 cái nữa ạ, Ở mục Bài viết theo tags e không sắp xếp theo thời gian mới nhất được, vì e rút dữ liệu từ pivot table Làm đến đây thấy nặng quá ạ