sql >> Database >  >> RDS >> Mysql

Hoe schrijf je dit (left join, subquery ) in Laravel 5.1?

Om subquery's te gebruiken met de querybuilder van Laravel, moet u deze als volgt aan de join toevoegen:

->leftJoin(DB::raw("(SELECT [...]) AS p"), 'p.post_id', '=', 'posts.id')

Het is ook beter om een ​​alias te maken voor berekende velden, zoals u deed in uw onbewerkte zoekopdracht:

COUNT(*) AS count

Ondanks deze wijzigingen kunt u, tenzij ik het mis heb, beginnen door uw vraag eenvoudiger te maken. Zet de subquery's op deze manier neer:

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

Vervolgens kun je met deze nieuwe query Laravel gebruiken om deze te bouwen:

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();

Merk op dat ik aanneem dat je een kolom hebt met de naam id in je comments tabel die de primaire sleutel is.




  1. Wat is er mis met mijn CASE?

  2. converteer xml-gegevens naar mysql-query voor invoegen/bijwerken met php

  3. Is er een snelkoppeling voor SELECT * FROM?

  4. Haal max rij per groep uit een gerelateerde tabel