简体   繁体   English

将原始 SQL 转换为 Laravel 查询生成器

[英]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.我很难将此 SQL 查询转换为 Laravel 查询生成器。我尝试了几个小时,但无法解决这个问题。我尝试了用于转换 Z9778840A0100CB30C982876741B0B5 的在线工具。

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?我怎样才能转换这个?

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如果您有任何问题,请告诉我:) ofc 无法在本地测试

DB::table('adopting_technologies')
            ->select('adopting_technologies.technology_id', 'technologies.name_en')
            ->selectRaw("
                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();
class adopting_technologies extends Model
{
    public function newCollection(array $models = [])
    {
        return new FarmerCollection($models);
    }
    public function adopting_farmers()
    {
        return $this->belongsTo(adopting_farmers::class);
    }
    // other relations for 'cig_members', 'farmers', 'financial_years' and 'technologies'
}
namespace App\Collections;

use Illuminate\Database\Eloquent\Collection;
 
class FarmerCollection extends Collection
{

    public function cigTotal()
    {
        return $this->pluck('cig_members')->map(function($items) { return $items->count(); })->sum();
    }
    // other totals for cigTotalEthnic, CigTotalFemale, CigTotalEthnicFemale, NonCigTotal, NonCigtoTalEthnic, NonCigTotalFemale, NonCigtTotalEthnicFemale
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM