我如何将 SQL 原始查询重写为 Laravel 查询生成器
Posted
技术标签:
【中文标题】我如何将 SQL 原始查询重写为 Laravel 查询生成器【英文标题】:How i can rewrite SQL raw query into Laravel Query Builder 【发布时间】:2020-10-11 08:01:30 【问题描述】:我有完美的 postgresql 查询
select "exhibitions_artworks".*, "curator_rating"."curator_id", "curator_rating"."selected",
"curator_rating"."rating", "curator_rating"."submitted" from "exhibitions_artworks"
full outer join "curator_rating" on "curator_rating"."artwork_id" = "exhibitions_artworks"."id"
where "exhibitions_artworks"."exhibition_id" = 15
and "exhibitions_artworks"."exhibition_id" is not null
and "active" = true
and "exhibitions_artworks"."status" = 0
and "curator_rating"."curator_id" = 71 or "curator_rating"."curator_id" is null
我使用 laravel,我想将它重写到 Laravel 查询生成器中。但是 Laravel ORM 不支持full outer join
。有什么想法吗?
【问题讨论】:
您可以通过两个查询来做到这一点。你使用LeftJoin
、RightJoin
和UnionALL
...
如果你真的想使用 ORM,最好从你想要的结果集开始,而不是 SQL 语句。
【参考方案1】:
在 Laravel 上,如果你想写 SQL raw,你可以使用DB:raw
。
例子:
$results = DB::select( DB::raw("SELECT * FROM table WHERE column = '$variable'") );
DB::raw()
用于生成查询生成器不会进一步解析的任意 SQL 命令。
(更新)
以如下 SQL 为例:
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.id;
我们也可以使用 UNION 来处理同样的结果:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id
在 Laravel 框架中,可以使用 unionAll 方法:
$first = DB::table('users')
->whereNull('first_name');
$users = DB::table('users')
->whereNull('last_name')
->union($first)
->get();
参考:https://laravel.com/docs/7.x/queries#unions
【讨论】:
用一个雄辩的例子更新了我的答案。以上是关于我如何将 SQL 原始查询重写为 Laravel 查询生成器的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL