Để sử dụng truy vấn con với trình tạo truy vấn của Laravel, bạn nên thêm nó vào tham gia như sau:
->leftJoin(DB::raw("(SELECT [...]) AS p"), 'p.post_id', '=', 'posts.id')
Tốt hơn là bạn nên tạo bí danh cho các trường được tính toán, như bạn đã làm trong truy vấn thô của mình:
COUNT(*) AS count
Bất chấp những thay đổi này, trừ khi tôi sai, bạn có thể bắt đầu bằng cách làm cho truy vấn của mình đơn giản hơn. Bỏ truy vấn con theo cách này:
SELECT
p.id,
p.title,
p.created_at,
p.updated_at,
u.name,
COUNT(c.id) AS comments_count,
COALESCE(SUM(pl.status), 0) AS status_sum
FROM
posts p
LEFT OUTER JOIN
users u
ON
u.id = p.user_id
LEFT OUTER JOIN
postslikes pl
ON
pl.post_id = p.id
LEFT OUTER JOIN
comments c
ON
c.post_id = p.id
ORDER BY
comments_count DESC
GROUP BY
p.id
Sau đó, với truy vấn mới này, bạn có thể sử dụng Laravel để xây dựng nó:
DB::table('posts')
->select([
'posts.id',
'posts.title',
'posts.created_at',
'posts.updated_at',
'users.name',
DB::raw('COUNT(comments.id) AS comments_count'),
DB::raw('COALESCE(SUM(postslikes.status), 0) AS status_sum'),
])
->leftJoin('users', 'users.id', '=', 'posts.user_id')
->leftJoin('comments', 'comments.post_id', '=', 'posts.id')
->leftJoin('postslikes', 'postslikes.post_id', '=', 'posts.id')
->orderBy('comments_count', 'DESC')
->groupBy('posts.id')
->get();
Lưu ý rằng tôi giả sử bạn có một cột có tên id
trong comments
bảng là khóa chính.