如何将 sql 转换为查询生成器 laravel

Posted

技术标签:

【中文标题】如何将 sql 转换为查询生成器 laravel【英文标题】:how to convert sql to query builder laravel 【发布时间】:2021-04-30 07:15:39 【问题描述】:

谁能帮我将此 SQL 转换为查询生成器!

SELECT topwords.*, 
       mw.word AS my_word 
FROM   topwords 
       LEFT JOIN (SELECT DISTINCT words.word 
                  FROM   definition_word 
                         JOIN words 
                           ON words.id = definition_word.word_id 
                  WHERE  definition_word.user_id = $user) AS mw 
              ON topwords.word = mw.word 

我对如何在 leftjoin 中使用子查询有疑问!

我尝试过这样的事情,但它有错误! See error as image

DB::table('topwords')
                    ->leftJoin(DB::raw("SELECT DISTINCT
                    words.word
                    FROM definition_word 
                    JOIN words ON words.id = definition_word.word_id
                    WHERE definition_word.user_id = $user as mw"),"topwords.word", "=", "mw.word" )
                    ->select(
                        "topwords.*",
                        "mw.word AS my_word"
                    )->orderBy('id','desc')->paginate(15);

【问题讨论】:

【参考方案1】:

可以使用Join Sub查询官方文档subquery-joins

$mw = DB::table('words')
        ->select('DISTINCT words.word')
        ->join('definition_word', function($join) use ($user)
        
            $join->on('wordss.id', '=', 'definition_word.word_id')
                 ->where('definition_word.user_id',  $user);
        );
        
$topwords = DB::table('topwords')
        ->joinSub($mw, 'mw',function ($join) 
            $join->on('topwords.word', '=', 'mw.word');
        )
        ->select('topwords.*','mw.word AS my_word')
        ->orderBy('id','desc')
        ->paginate(15);

【讨论】:

您好!当我检查 dd($topwords) topwords 变量时,表格上不会显示一个数组。 prnt.sc/xpgn87 查看 $topwords 变量的图像。如果你能帮助我提前谢谢你! topwards 的 dd 将返回 lengthAwarePaginator 对象,实际数据将在图像中显示为空数组的项目中 但我在表中有 4500 条记录,作为标准 SQL,它正在选择记录。如果你能帮忙,请...提前谢谢你 ok 怎么样 get $mw the dd it dd($mw->get());在使用 join sub 显示第一个查询结果的确切内容之前 您也可以在刀片的 foreach 循环中返回 $topwords 或只返回响应 json 以显示它的项目【参考方案2】:

由于分页和聚合

,您会遇到此错误

尝试使用 LengthAwarePaginator 进行自定义分页

这里是示例:Laracast

所以你需要做这样的事情:

  $query = DB::table('topwords')
                        ->leftJoin(DB::raw("SELECT DISTINCT
                        words.word
                        FROM definition_word 
                        JOIN words ON words.id = definition_word.word_id
                        WHERE definition_word.user_id = $user as mw"),"topwords.word", "=", "mw.word" )
                        ->select(
                            "topwords.*",
                            "mw.word AS my_word"
                        );
    
    
    $paginator = new LengthAwarePaginator($query->get(), $query->count(), $request->input('per_page', 15), $request->input('page', 1));

然后就可以在集合中使用了

【讨论】:

您好!我使用了这段代码,但我有一些错误。如果你可以请帮助我。 -- SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“SELECT DISTINCT words.word FROM definition_word JOIN wo”附近使用正确的语法(SQL:选择 topwords.*、mw.word as @ 987654326@ from topwords left join SELECT DISTINCT words.word FROM definition_word JOIN words ON words.id = definition_word.word_id WHERE definition_word.user_id = 2 as mw on topwords.word = mw.word) 我认为您需要将 SELECT 语句放入大括号中,例如:“(SELECT DISTINCT ..... $user as mw)”

以上是关于如何将 sql 转换为查询生成器 laravel的主要内容,如果未能解决你的问题,请参考以下文章

将 PHP SQL 转换为 Laravel 查询构建器 [重复]

将 SQL 转换为 Laravel 查询生成器错误 - 需要专家级别

我如何将 SQL 原始查询重写为 Laravel 查询生成器

如何将复杂的 sql 查询转换为 laravel Eloquent

如何将此 SQL 转换为 Laravel Query Builder 查询?

如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?