Search code examples
phpsqllaravellaravel-query-builder

Convert raw SQL to Laravel Query Builder


I'm having difficulty converting this SQL query to Laravel Query Builder.I tried for hours but couldn't get my head around this.I tried online tools for converting SQL to Query builder but didn't work.

Here is my code:

SELECT 
   technologies.name_en,
   Count(cig_members.id) AS CigTotal,
   Count(CASE
           WHEN cig_members.is_ethnic = 1 THEN 1
           ELSE NULL
         END) AS CigTotalEthnic,
   Count(CASE
           WHEN cig_members.gender = 'female' THEN 1
           ELSE NULL
         END) AS CigTotalFemale,
   Count(CASE
           WHEN cig_members.gender = 'female'
                AND cig_members.is_ethnic = 1 THEN 1
           ELSE NULL
         END) AS CigTotalEthnicFemale,
   Count(farmers.id) AS NonCigTotal,
   Count(CASE
           WHEN farmers.is_ethnic = 1 THEN 1
           ELSE NULL
         END) AS NonCigtoTalEthnic,
   Count(CASE
           WHEN farmers.gender = 'female' THEN 1
           ELSE NULL
         END) AS NonCigTotalFemale,
   Count(CASE
           WHEN farmers.gender = 'female'
                AND farmers.is_ethnic = 1 THEN 1
           ELSE NULL
         END) AS NonCigtTotalEthnicFemale
   FROM   adopting_technologies
   JOIN adopting_farmers
          ON adopting_farmers.id = adopting_technologies.adopting_farmer_id
   LEFT JOIN cig_members
          ON cig_members.id = adopting_farmers.cig_member_id
   LEFT JOIN farmers
          ON farmers.id = adopting_farmers.farmer_id
   LEFT JOIN financial_years
          ON financial_years.id = adopting_farmers.financial_year_id
   LEFT JOIN technologies
          ON technologies.id = adopting_technologies.technology_id
   GROUP  BY adopting_technologies.technology_id

How can I convert this?


Solution

  • It should look roughly like this:

    $result = AdoptingTechnology::selectRaw("
            technologies.name_en,
       Count(cig_members.id) AS CigTotal,
       Count(CASE
               WHEN cig_members.is_ethnic = 1 THEN 1
               ELSE NULL
             END) AS CigTotalEthnic,
       Count(CASE
               WHEN cig_members.gender = 'female' THEN 1
               ELSE NULL
             END) AS CigTotalFemale,
       Count(CASE
               WHEN cig_members.gender = 'female'
                    AND cig_members.is_ethnic = 1 THEN 1
               ELSE NULL
             END) AS CigTotalEthnicFemale,
       Count(farmers.id) AS NonCigTotal,
       Count(CASE
               WHEN farmers.is_ethnic = 1 THEN 1
               ELSE NULL
             END) AS NonCigtoTalEthnic,
       Count(CASE
               WHEN farmers.gender = 'female' THEN 1
               ELSE NULL
             END) AS NonCigTotalFemale,
       Count(CASE
               WHEN farmers.gender = 'female'
                    AND farmers.is_ethnic = 1 THEN 1
               ELSE NULL
             END) AS NonCigtTotalEthnicFemale
             ")
                ->join('adopting_farmers', 'adopting_farmers.id','adopting_technologies.adopting_farmer_id')
                ->leftJoin('cig_members','cig_members.id','adopting_farmers.cig_member_id')
                ->leftJoin('farmers','farmers.id','adopting_farmers.farmer_id')
                ->leftJoin('financial_years','financial_years.id','adopting_farmers.financial_year_id')
                ->leftJoin('technologies','technologies.id','adopting_technologies.technology_id')
                ->groupBy('adopting_technologies.technology_id')
                ->get();
    

    If you have any issues let me know:) ofc cannot test it locally