我如何将 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。有什么想法吗?

【问题讨论】:

您可以通过两个查询来做到这一点。你使用LeftJoinRightJoinUnionALL... 如果你真的想使用 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

如何在 Laravel 6 中转换原始 sql 查询?

如何在 Laravel 7 中使用原始 SQL 查询创建范围?

将原始 SQL 查询传递给 Laravel 上的查询构建器

在 Laravel 4 中转义原始 SQL 查询

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy