Tư vấn cách làm trang news feed
Như tiêu đề thì hiện tại mình đang có 2 bảng là Câu hỏi và Tin tuyển dụng, mình đang muốn khi mình load dữ liệu ra trang news feed thì sẽ mix dữ liệu của 2 bảng đó lại vẫn order theo thời gian tạo mới nhất, nhưng mình đang vướng ở đoạn mix dữ liệu của 2 bảng đó. Mọi người có cách nào để làm không nhỉ? p/s: mình muốn lấy dữ liệu ở cả 2 bảng đó cùng 1 lúc và mix vào với nhau
1 CÂU TRẢ LỜI
@TuanAnh9996 Nếu cậu dùng SQL thì có thể dùng UNION ALL
để nối nhiều câu truy vấn lấy dữ liệu làm một câu truy vấn duy nhất. Kết quả sẽ là tổng hợp kết quả của các câu truy vấn được nối. Điểm lưu ý là mệnh đề select trong các câu truy vấn phải lấy ra field name như nhau. Trong case của cậu là lấy dữ liệu từ bảng Câu hỏi
và bảng Tin tuyển dụng
.
Cú pháp mẫu dạng như này:
SELECT *
FROM (
query_1
UNION ALL
query_2
UNION_ALL
query_3
...
) as results
....
Example:
SELECT *
FROM (
SELECT title, created_at FROM questions
UNION ALL
SELECT name as title, created_at FROM jobs
) as new_feeds
ORDER BY new_feeds.created_at DESC
nếu dùng Union thì mình có thể kết hợp với paginate của laravel không nhỉ?
@TuanAnh9996 Bạn dùng query builder để build nó thành một câu query. Sau đó sử dụng hàm paginate như bình thường.
Câu truy vấn này hơi phức tạp nên cậu cần dùng kết hợp quả Query Builder, cả DB::raw để build nhé. Cậu có thể tách thành các class riêng rồi inject vào controller và sử dụng:
class NewFeedQueryBuilder
{
public function getQuery()
{
return $this->getQuestionsQuery()
->unionAll($this->getJobsQuery());
}
protected function getQuestionsQuery()
{
return Question::query()->select('title', 'created_at');
}
protected function getJobsQuery()
{
return Job::query()->select(DB::raw('name as title, created_at'));
}
}
Cậu đang dùng SQL hay NoSQL vậy nhỉ?
@huukimit mình dùng mysql