如何从 Laravel Query Builder 中的两个 selected 表 select?

How to select from two selected tables in Laravel Query Builder?

我想将我的 SQL 转换为 Laravel Query Builder 版本,但是我不能这样做。谁能帮我解决这个问题或者给我一些建议,谢谢。

原始 SQL 在 mysql 服务器上运行良好。

SELECT Ifnull(no_of_accepted_job_offer, 0) AS no_of_accepted_job_offer
FROM   (SELECT job_name AS offer_job
        FROM   portal_setting) AS T1
       LEFT JOIN (SELECT Count(job_master.appno) AS no_of_accepted_job_offer,
                         job_master.offer_job
                  FROM   job_master
                         JOIN job_apply
                           ON job_master.appno = job_apply.appno
                  WHERE  job_apply.year = '2021'
                         AND job_master.status = 'accept'
                  GROUP  BY job_master.offer_job) AS T2
              ON T1.offer_job = T2.offer_job; 

已将原始 SQL 转换为 Laravel 查询生成器,但它不起作用。

错误:SQLSTATE[42S02]:未找到基 table 或视图:1146 Table '(select COUNT(job_master.appno)'不存在

DB::table(DB::raw('(SELECT job_name AS offer_job
        FROM   portal_setting) AS T1'))
->select(DB::raw('Ifnull(no_of_accepted_job_offer,0) AS no_of_accepted_job_offer'))
->leftJoin('(SELECT Count(job_master.appno) AS no_of_accepted_job_offer,
                         job_master.offer_job
                  FROM   job_master
                         JOIN job_apply
                           ON job_master.appno = job_apply.appno
                  WHERE  job_apply.year = \'2021\'
                         AND job_master.status = \'accept\'
                  GROUP  BY job_master.offer_job) AS T2','T1.offer_job','=','T2.offer_job')
->get();

DB::table 不适用于子查询。

但您可以使用 fromSubjoinSub。这些将采用闭包或查询构建器查询来定义您的子查询。

您还可以使用 DB::query() 访问查询构建器,因为您不能使用特定的 table.

您会发现 sql 的每一行都可以由查询构建器中的一个函数表示。值得查看文档,甚至是源代码只是为了找到所有功能。

所以我想到了这样的东西:

$joinSubQuery = DB::table('job_master')
    ->join('job_apply', 'job_master.appno', '=', 'job_apply.appno')
    ->where('job_apply.year', '2021')
    ->where('job_master.status', 'accept')
    ->groupBy('job_master.offer_job')
    ->select('job_master.offer_job')
    ->selectRaw('count(job_master.appno as no_of_accepted_job_offer');


DB::query()
    ->fromSub(function($query) {
        $query->from('portal_setting')
            ->select('job_name as offer_job');
    }, 'T1')
    ->leftJoinSub($joinSubQuery, 'T2', function($join) {
        $join->on('T1.offer_job', '=', 'T2.offer_job')
    })
    ->selectRaw('Ifnull(no_of_accepted_job_offer, 0) AS no_of_accepted_job_offer')
    ->get();