How to write this (left join, subquery ) in Laravel 5.1?

前端 未结 1 839
庸人自扰
庸人自扰 2021-01-05 08:38

How to write this query in Laravel 5.1:

SELECT p.id, p.title, p.created_at, p.updated_at, u.name, COALESCE(c.comments_count, 0) AS comments_count, COALESCE(p         


        
1条回答
  •  时光取名叫无心
    2021-01-05 09:00

    To use subqueries with Laravel's query builder, you should add it to the join as follows:

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

    It's also better to create an alias for calculated fields, as you did in your raw query:

    COUNT(*) AS count
    

    Despite this changes, unless I'm wrong, you can start by making your query simpler. Drop the subqueries, this way:

    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
    

    Then, with this new query, you can use Laravel to build it:

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

    Note that I'm assuming you have a column named id in your comments table that is the primary key.

    0 讨论(0)
提交回复
热议问题