Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

gbelot2003's avatar

Complex sql query

Hello everyone, I want to migrate a old site of stadistics to laravel, But I wander, what is the laravel way to handle this query, I mean, on active records I had to go directly to write the query, there were no way to handle it. maybe exist something similar to write this directly, or a librarie or something !! this is the query:

public function agresiones_get_genero($year){
    $query  = " SELECT tsagredido.id, tsagredido.tsagredido, 
            SUM( IF (agredidos.gen_id = 1, 1, 0) ) m, SUM( IF  (agredidos.gen_id = 2, 1, 0) ) f,
            SUM( IF (agredidos.gen_id = 3, 1, 0) ) l, SUM( IF (agredidos.gen_id = 4, 1, 0) ) n 
            FROM agredidos
            INNER JOIN tsagredido ON agredidos.tsagredido_id = tsagredido.id
            INNER JOIN alertas ON agredidos.alertas_id = alertas.id
            WHERE alertas.anio = $year AND alertas.publicada_id = 1 GROUP BY agredidos.tsagredido_id";
               return $this->find_all_by_sql($query);
    }

There are 4 tables involve, tsagredidos, gender, agredidos and alerts (edited, I write this 4 years ago :/)

where alert is the bridge, the selected options for every alerts were gender as tsagredidos, gender contemps male(m), female(f), Lesbians,gays, Transexuals(l) and none(n), while tsagredidos is another class of agressions related to the "alert" The query reflets the results sumary for alerts totals of m, f, l and n for every tsagredidos option on a given year.

if you wander how it looks, this is the view, where this model method reflecs http://alertas.clibrehonduras.com/reportes/sujeto_agredido_genero

Thaks for ANY help I know is a tough one!!!

0 likes
3 replies
gbelot2003's avatar

Nevermind, $results = DB::select($query); at the end.

Amrit01's avatar
Amrit01
Best Answer
Level 1
    Agredidos::join('tsagredido','agredidos.tsagredido_id','=','tsagredido.id')
        ->join('alertas','agredidos.alertas_id','=','alertas.id')
        ->where('alertas.anio',$year)
        ->where('alertas.publicada_id',1)
        ->groupBy('agredidos.tsagredido_id')
        ->get([
            'tsagredido.id,',
            'tsagredido.tsagredido',
            DB::raw('SUM( IF (agredidos.gen_id = 1, 1, 0) ) m'),
            DB::raw('SUM( IF  (agredidos.gen_id = 2, 1, 0) ) f'),
            DB::raw('SUM( IF (agredidos.gen_id = 3, 1, 0) ) l'),
            DB::raw('SUM( IF (agredidos.gen_id = 4, 1, 0) ) n )

        ]);

or

    DB::table('agredidos')->join('tsagredido','agredidos.tsagredido_id','=','tsagredido.id')
        ->join('alertas','agredidos.alertas_id','=','alertas.id')
        ->where('alertas.anio',$year)
        ->where('alertas.publicada_id',1)
        ->groupBy('agredidos.tsagredido_id')
        ->get([
            'tsagredido.id,',
            'tsagredido.tsagredido',
            DB::raw('SUM( IF (agredidos.gen_id = 1, 1, 0) ) m'),
            DB::raw('SUM( IF  (agredidos.gen_id = 2, 1, 0) ) f'),
            DB::raw('SUM( IF (agredidos.gen_id = 3, 1, 0) ) l'),
            DB::raw('SUM( IF (agredidos.gen_id = 4, 1, 0) ) n )

        ]);

This might work for u :)

1 like

Please or to participate in this conversation.