将复数 SQL select 转换为 Laravel Eloquent

Converting complex SQL select to Laravel Eloquent

我是 Laravel 的新手,正在尝试支持 Laravel 5 中的现有应用程序。我正在尝试将以下 SQL 转换为 eloquent 结构

SELECT s.id, 
CONCAT(u.first_name, ' ', u.last_name) AS user_name, 
u.avatar_location AS user_img, 
s.employee_photo, 
d.name AS department, 
seg.name AS segment, 
s.survey_title, 
s.before_action, 
s.before_picture, 
s.action, 
s.action_date, 
s.after_action, 
s.after_picture, 
s.nominated, 
s.awarded, 
s.created_at, 
s.updated_at,
(SELECT COUNT(1) FROM likes l WHERE l.survey_id = s.id) AS likes,
(SELECT COUNT(1) FROM likes l WHERE l.survey_id = s.id AND l.user_id = 5) AS UserLikes,
(SELECT COUNT(1) FROM comments c WHERE c.survey_id = s.id ) AS comments
FROM surveys s 
JOIN departments d 
ON s.department = d.id 
JOIN segments seg 
ON s.segment_id = seg.id 
JOIN users u 
ON s.user_id = u.id 
WHERE s.status = 'Approved' 
ORDER BY s.action_date DESC
LIMIT 20 OFFSET 20

我足够了解 Laravel 知道我的基本起点可能是

$surveys = DB::table('surveys')
    ->join('departments',  'surveys.department', '=', 'departments.id')
    ->join('segments', 'surveys.segment_id', '=', 'segments.id')
    ->join('users', 'surveys.user_id', '=', 'users.id')
    ->where('surveys.status', 'Approved')
    ->orderBy('surveys.action_date')
    ->skip(20)-take(20)
    ->select(...)->get();

但是,我不确定如何进行子查询。寻找任何建议。

谢谢!

对于 select 语句,您可以使用 DB::raw()。

$surveys = DB::table('surveys')
    ->join('departments',  'surveys.department', '=', 'departments.id')
    ->join('segments', 'surveys.segment_id', '=', 'segments.id')
    ->join('users', 'surveys.user_id', '=', 'users.id')
    ->where('surveys.status', 'Approved')
    ->orderBy('surveys.action_date')
    ->skip(20)-take(20)
    ->select([DB::raw('(SELECT COUNT(1) FROM likes l WHERE l.survey_id = s.id) AS likes'),
    ...
    ])
    ->get();

类似地,select 语句将位于 select 数组下。明确一点,结果将是一个集合。