【问题标题】:how to convert sql to query builder laravel如何将 sql 转换为查询生成器 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);

【问题讨论】:

    标签: laravel eloquent query-builder


    【解决方案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)”
    猜你喜欢
    • 2021-08-07
    • 2017-06-01
    • 2019-09-08
    • 2017-04-22
    • 2023-01-14
    • 2021-02-23
    • 2019-10-14
    • 2015-12-13
    • 2019-06-21
    相关资源
    最近更新 更多