如何将 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