Php 如何将左联接中包含联接的sql转换为查询生成器? 我需要从sql编写一个查询生成器,它在左连接中有一个连接。 这是在另一个左连接中有一个连接的SQL。 (问题)这是我试图从上面的SQL转换的查询生成器。

Php 如何将左联接中包含联接的sql转换为查询生成器? 我需要从sql编写一个查询生成器,它在左连接中有一个连接。 这是在另一个左连接中有一个连接的SQL。 (问题)这是我试图从上面的SQL转换的查询生成器。,php,sql,laravel,join,query-builder,Php,Sql,Laravel,Join,Query Builder,但是,我的查询生成器是错误的。 它会显示一条错误消息 SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本对应的手册,了解正确的语法 并生成SQL SQL:从v\u dts左连接中选择v\u dts*(in\u h内部连接in\u d2onin\u h文档中的文档中的代码和文档中的文档中的代码 有人能帮我解决我的问题吗? 谢谢。您需要一个子查询左联接->leftJoin('in_h',function($join_in_h){…}不执行子查

但是,我的查询生成器是错误的。 它会显示一条错误消息

SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本对应的手册,了解正确的语法

并生成SQL

SQL:从
v\u dts
左连接中选择
v\u dts
*(
in\u h
内部连接
in\u d2
on
in\u h
文档中的
文档中的
代码
文档中的
文档中的
代码

有人能帮我解决我的问题吗?
谢谢。

您需要一个子查询左联接
->leftJoin('in_h',function($join_in_h){…}
不执行子查询连接;这是一个带有奇特连接子句的常规左连接

改用
->leftJoinSub

可以使用joinSub、leftJoinSub和rightJoinSub方法将查询连接到子查询。这些方法中的每一个都接收三个参数:子查询、其表别名和定义相关列的闭包

编写子查询

$ref_books = DB::table('in_h')
    ->select('in_d2.ref_book')
    ->join('in_d2', function($join){
        $join->on('in_h.doc_code','=','in_d2.doc_code')
             ->where('in_h.book','=','in_d2.book');
    })
    ->where('in_h.doc_code','=','IN')
    ->groupBy('in_d2.ref_book');
并在另一个查询中使用它

$order_progress = DB::table('v_dts')
    ->select('v_dts.*')
    ->leftJoinSub($ref_books, 'i',function($join){
        $join->on('v_dts.book', '=', 'i.ref_book');
    })
    ->get();
您可以使用转储生成的SQL以进行调试


注意:我没有Laravel,所以我无法检查它是否100%正确,但它应该让您走上正确的道路。

这看起来像Perl,但您使用的是什么查询生成器?您可以让它打印生成的SQL吗?这是php Laravel的查询生成器。生成的SQL显示在错误消息中
SQL:选择v_dts.*从v_dts left join(in_h.doc\u code=in_d2.doc\u code和in_h.book=in_d2.book和in_h.doc\u code=in)中选择v_dts.
感谢您耐心的解释。这是我的正确答案。
$ref_books = DB::table('in_h')
    ->select('in_d2.ref_book')
    ->join('in_d2', function($join){
        $join->on('in_h.doc_code','=','in_d2.doc_code')
             ->where('in_h.book','=','in_d2.book');
    })
    ->where('in_h.doc_code','=','IN')
    ->groupBy('in_d2.ref_book');
$order_progress = DB::table('v_dts')
    ->select('v_dts.*')
    ->leftJoinSub($ref_books, 'i',function($join){
        $join->on('v_dts.book', '=', 'i.ref_book');
    })
    ->get();