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
,知道只有这个值。
这是一个老问题,但使用原始表达式很有可能。以下是问题给出的示例的样子:
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`)')