【发布时间】:2022-12-05 21:19:15
【问题描述】:
我在我的项目中使用Laravel Eloquent ORM。
我需要复制一个基本查询以创建不同的查询,作为副产品,我对某些 JOIN 语句的顺序有疑问。
为了简化问题,此查询显示了我遇到的问题:
SELECT *
FROM A
JOIN C ON C.x = B.x
JOIN B ON B.y = A.y;
执行此查询,出现以下错误:
ERROR 1054 (42S22): Unknown column 'B.x' in 'on clause'
我假设原因是当 SQL 解析器到达第一个连接时,表 B 尚未包括在内。然而,如果我切换这两行,代码会变得非常笨拙(见最后的解释)。
有没有办法以这种格式执行此查询?
或者,有没有办法注入在第一个使用雄辩的查询生成器之前的第二个连接语句?
为什么我不能切换JOIN命令?
我有一个基本查询,这对于我需要执行的不同查询是通用的:
SELECT * FROM A
JOIN C ON C.x = B.x
第二个JOIN(B表)的键取决于我要执行的最终查询。例如,我可能有:
:
JOIN B ON B.y = A.y1
在另一个查询中:
:
JOIN B ON B.y = A.y2
在雄辩的(非常简化的)代码看起来像:
$baseQuery = DB::table('A')->join('C', 'C.x', '=', 'A.x');
$query1 = (clone $baseQuery)->join('B', 'B.y', '=', 'A.y1');
$query2 = (clone $baseQuery)->join('B', 'B.y', '=', 'A.y2');
【问题讨论】:
-
您确实需要解释为什么切换连接子句会使您的代码变得笨拙!顺便说一句,你可以在所有连接之后有一个 on 子句。
标签: php mysql laravel eloquent