Laravel के क्वेरी बिल्डर के साथ सबक्वायरी का उपयोग करने के लिए, आपको इसे इस तरह से जॉइन में जोड़ना चाहिए:
->leftJoin(DB::raw("(SELECT [...]) AS p"), 'p.post_id', '=', 'posts.id')
परिकलित फ़ील्ड के लिए उपनाम बनाना भी बेहतर है, जैसा आपने अपनी कच्ची क्वेरी में किया था:
COUNT(*) AS count
इन परिवर्तनों के बावजूद, जब तक मैं गलत नहीं हूँ, आप अपनी क्वेरी को सरल बनाकर शुरू कर सकते हैं। उपश्रेणियों को इस तरह छोड़ें:
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
फिर, इस नई क्वेरी के साथ, आप इसे बनाने के लिए Laravel का उपयोग कर सकते हैं:
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();
ध्यान दें कि मैं मान रहा हूं कि आपके पास id
. नाम का एक कॉलम है आपकी comments
. में तालिका जो प्राथमिक कुंजी है।