【问题标题】:Convert raw SQL query to Laravel DB builder query将原始 SQL 查询转换为 Laravel DB 构建器查询
【发布时间】:2020-10-19 08:26:32
【问题描述】:

我需要使用 DB 查询构建器将以下原始查询转换为 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();

【问题讨论】:

  • 在寻求帮助之前,您应该向我们展示自己尝试解决问题的方法。像这样的问题是请求代码而不是请求帮助。
  • 很抱歉您将我的评论解读为负面。我会改写它。请向我们展示您解决问题的尝试,以便我们更好地帮助您。这个问题目前的形式不适合 SO,因为它太宽泛了。

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


【解决方案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();

【讨论】:

    【解决方案2】:

    试试DB::raw() 喜欢:

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

    DB::raw() 用于生成不被解析的任意 SQL 命令 查询生成器的任何进一步。

    【讨论】:

    • 这是一个非常稀疏的答案,这个问题有一个DB::table查询方法,我只是今晚之前没有时间写答案。
    猜你喜欢
    • 2019-02-03
    • 2021-08-19
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 2017-01-05
    • 2015-06-26
    • 2019-05-31
    相关资源
    最近更新 更多