Yêu cầu thg 11 1, 2018 8:26 SA 147 0 1
  • 147 0 1
0

Tư vấn cách làm trang news feed

Chia sẻ
  • 147 0 1

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

thg 11 2, 2018 1:42 SA

Cậu đang dùng SQL hay NoSQL vậy nhỉ?

Avatar Tobie @TuanAnh9996
thg 11 2, 2018 2:15 SA

@huukimit mình dùng mysql

1 CÂU TRẢ LỜI


Đã trả lời thg 11 2, 2018 2:14 SA
Đã được chấp nhận
+3

@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
Chia sẻ
Avatar Tobie @TuanAnh9996
thg 11 2, 2018 5:03 SA

nếu dùng Union thì mình có thể kết hợp với paginate của laravel không nhỉ?

thg 11 2, 2018 6:54 SA

@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.

thg 11 2, 2018 6:56 SA

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'));
  }
}
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí