I want to convert my SQL to Laravel Query Builder version, however I can’t do that. Can anyone help me to solve this case or give me some advices, thank you.
Original SQL that work fine in mysql server.
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;
Converted the original SQL to Laravel Query Builder, but it doesn’t work.
Error: SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘(select COUNT(job_master.appno)’ doesn’t exist
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();
Advertisement
Answer
DB::table doesn’t really work with subqueries.
But you can use fromSub
and joinSub
. These will take closures or query builder queries to be able to define your subqueries.
You can also access the query builder using DB::query() since you can’t use a specific table.
You’ll find each line of sql could be represented by a function in the query builder. It is worth looking through the documentation, or even the source code just to find all the functions.
So I came up with something like this:
$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();