如何从 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 不适用于子查询。
但您可以使用 fromSub
和 joinSub
。这些将采用闭包或查询构建器查询来定义您的子查询。
您还可以使用 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();
我想将我的 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 不适用于子查询。
但您可以使用 fromSub
和 joinSub
。这些将采用闭包或查询构建器查询来定义您的子查询。
您还可以使用 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();