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();