如何使用 Laravel 的查询生成器在 JOIN 查询中生成 USING 子句?

问题描述 投票:0回答:2

PostgreSQL 支持 JOIN 语句中的 USING 子句,我想用它来简化我的查询。例如:

 select * from a join b using (x, y, z) where ... order by x;

如何使用 Laravel 的查询生成器或 Eloquent 来表达这一点?

DB::table('a')
    ->select('*')
    ->join('b', function($join))
    ->where(...)
    ->orderBy('x');

请注意,这个问题与https://stackoverflow.com/questions/31465918/how-to-generate-a-natural-join-query-with-laravels-query-builder不同,我在其中询问NATURAL JOIN ,而不是加入使用。

此外,我知道使用多个

$join->on(...)
语句可以达到几乎相同的效果,但是我有重复的列,并且必须始终限定
a
b
中的列。也就是说,我必须写
'a.x'
而不是
'x'
,尽管这并不重要,因为连接查询确保两者都相等。 USING 子句巧妙地解决了这个问题,通过只生成一个结果列
x
,知道只有这个值。

php postgresql laravel join laravel-4
2个回答
4
投票

所以,答案是——不可能。

我在 Laravel 5 上继续这个问题,仍然不可能。

我的问题 - Laravel 5. 使用 USING 运算符

我的拉取请求 - https://github.com/laravel/framework/pull/12773


0
投票

这是一个老问题,但使用原始表达式很有可能。以下是问题给出的示例的样子:

DB::table('a')
    ->join(DB::raw('b using (x, y, z)'), fn (JoinClause $j) => $j)
    ->where(...)
    ->orderBy('x')
    ->get()
需要

DB::raw()
,否则整个事情都会被转义,如果数据库不首先抱怨语法,它会抱怨找不到“
'b using (x,y,z)'
”表。

如果需要,您也可以添加自己的转义。

DB::raw('`b` using (`x`, `y`, `z`)')
© www.soinside.com 2019 - 2024. All rights reserved.