Asked Nov 1st, 2018 8:26 AM 112 0 1
  • 112 0 1
0

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

Share
  • 112 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

Nov 2nd, 2018 1:42 AM

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

0
| Reply
Share
Tuan Anh Nguyen @TuanAnh9996
Nov 2nd, 2018 2:15 AM

@huukimit mình dùng mysql

0
| Reply
Share

1 ANSWERS


Answered Nov 2nd, 2018 2:14 AM
Accepted
+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
Share
Tuan Anh Nguyen @TuanAnh9996
Nov 2nd, 2018 5:03 AM

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

0
| Reply
Share
Nov 2nd, 2018 6:54 AM

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

0
| Reply
Share
Nov 2nd, 2018 6:56 AM

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'));
  }
}
+1
| Reply
Share