将原始SQL查询转换为Laravel DB构建器查询

时间:2020-06-29 08:00:13

标签: sql database laravel laravel-query-builder laravel-facade

我需要使用数据库查询构建器将以下原始查询转换为Laravel查询的帮助。该查询必须使用DB(外观)查询构建器构建,而不是Eloquent。

SELECT distinct p.client_id
  FROM people p
JOIN (SELECT client_id, COUNT(*)
  FROM people
GROUP BY client_id
HAVING count(client_id) > 1 ) b
ON p.client_id = b.client_id
ORDER BY p.client_id')

到目前为止,这是我的解决方案:

$subQuery = DB::table('people')
            ->select('client_id', DB::raw('count(*)'))
            ->groupBy('client_id')
            ->havingRaw('count(client_id) > ?', [1]);

$mainQuery = DB::table('people')
            ->distinct('client_id')
            ->joinSub($subQuery, 'b', function ($join) {
                $join->on('people.client_id', '=', 'b.client_id');
            })
            ->orderBy('client_id')
            ->get();

2 个答案:

答案 0 :(得分:1)

像这样尝试DB::raw()

DB::select(DB::raw("Your query here"));

DB::raw()用于生成未解析的任意SQL命令 查询构建器可以进行任何进一步的处理。

答案 1 :(得分:1)

我找到了所需的解决方案:

$subQuery = DB::table('people')
   ->select('client_id', DB::raw('count(*)'))
   ->groupBy('client_id')
   ->havingRaw('count(client_id) > ?', [1]);

$peopleWithSameClient = DB::table('people')
   ->distinct('people.client_id')
   ->joinSub($subQuery, 'b', function ($join) {
          $join->on('people.client_id', '=', 'b.client_id');
   })
   ->orderBy('people.client_id')
   ->get();
相关问题