Make sum with SUM ()

2

The query that works in PhpMyAdmin:

Select sum(D.CargaHoraria) as CargaHorariaTotal, C.NomeCurso, C.CursoId, A.Imagem
             from Curso C
                  inner join Disciplina D on D.CursoId = C.CursoId
                  inner join Area A on A.AreaId = C.AreaId

             GROUP BY C.CursoId

Follow the same code in DB::select of Laravel and I can not return.

DB::select("        
          Select sum(D.CargaHoraria) as CargaHorariaTotal, C.NomeCurso, C.CursoId, A.Imagem
             from Curso C
                  inner join Disciplina D on D.CursoId = C.CursoId
                  inner join Area A on A.AreaId = C.AreaId

             GROUP BY C.CursoId
       ");

The intention and the following, I have Courses that each course has several disciplines, and each discipline has its workload, it is necessary to make the sum of the time loads of the disciplines to obtain the cargaHorariaTotal of the course.

But I'm not succeeding with Laravel .

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Response;
use App\CursoModel;
use DB;


class CursosController extends Controller
{
    public function __construct(CursoModel $objeto)
    {
        //No Auth
        $this->curso = $objeto;
    }

    public function CursosPosGraduacao()
    {

        return view('Cursos/CursosPosGraduacao');
    }

    public function CursosFormacaoPedagogica()
    {
        return view('Cursos/CursosFormacaoPedagogica');
    }

    public function CursosSegundaLicenciatura()
    {
        return view('Cursos/CursosSegundaLicenciatura');
    }

    public function CursoDetalhe()
    {
        return view('Cursos/CursoDetalhe');
    }

    public function retornarTodosOsCursos()
    {
        $Query = DB::select(DB::raw("        
          Select sum(D.CargaHoraria) as CargaHorariaTotal, C.NomeCurso, C.CursoId, A.Imagem
             from Curso C
                  inner join Disciplina D on D.CursoId = C.CursoId
                  inner join Area A on A.AreaId = C.AreaId

             GROUP BY C.CursoId
       "));
        return $Query;
    }
}

Route

//Matricule
Route::group(['prefix'=>'api'], function(){
    Route::group(['prefix'=>'Curso'],function(){

        Route::get('retornarTodosOsCursos',['uses'=>'CursosController@retornarTodosOsCursos']);

    });
});

CourseModel

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
use Hash;
use Response;
use DB;

class CursoModel extends Model
{
    //
    protected $primaryKey = 'CursoId';
    protected $fillable = ['CursoId', 'AreaId', 'NomeCurso', 'DescricaoCurso', 'ImagemCurso', 'NumeroDoCurso', 'UsuarioId'];
    public $table = 'Curso';


    public function GetAllRepositorio()
    {
        return self::all();
    }

    public function PostRepositorio()
    {
        if (Auth::check()) { //verifica se tem usuario logado
            $data = new CursoModel();
            $data->fill(Input::all());

            if (is_null($data)) {
                return false;
            }

            //Confere se CursoId e maior que 0
            if ($data["CursoId"] > 0) {
                //Envia o registro para Atualizar ja que o mesmo tem CursoId
                $data = $this->AtualizaRegistro($data["CursoId"]);
                //Se salvar retorna true se não retorna falso
                return $data;
            }

            $TodosOsCursos = self::all();
            foreach ($TodosOsCursos as $key => $value) {
                if ($value['NumeroDoCurso'] == $data['NumeroDoCurso'] || $value['NomeCurso'] == $data['NomeCurso']) {
                    return false;
                }
            }

            $data['UsuarioId'] = Auth::user()->id;
            return $data->save();
        }
    }

    public function DeletarRepositorio($id)
    {
        $data = self::find($id);
        if (is_null($data)) {
            return false;
        }
        $data->delete();
        return true;
    }

    public function AtualizaRegistro($CursoId)
    {
        if (Auth::check()) { //verifica se tem usuario logado
            //Procura registro no banco pelo $id
            $data = self::find($CursoId);

            //Caso não encontrar registro no banco retorna falso, abortando a operação
            if (is_null($data)) {
                return false;
            }

            //Recebe todos os valores novos que chegaram
            $input = Input::all();

            //Atribui os valores novos no registro 'data' encontrados no banco
            $data->fill($input);

            //Atribui o usuario que executou a ultima ação no registro
            $data['UsuarioId'] = Auth::user()->id;

            //Salva os registros no banco e retorna se atalizou ou não
            return $data->save();


        }
    }

    public function RetornaListaDeCursoPorArea($AreaId){

        $listaDeCursoPorArea = DB::table('Curso')->where('AreaId', $AreaId)->get();
        return $listaDeCursoPorArea;
    }
}
    
asked by anonymous 22.12.2016 / 13:29

2 answers

0

It can also be as follows:

in config/database.php :

Change to this:

...
'strict'=>false
...

So that you do not default to GROUP in the query

    
22.12.2016 / 13:41
1

You need to DB::raw or you can do it using Eloquent. Maintenance is best in the latter case.

Fluent

DB::select(DB::raw("        
          Select sum(D.CargaHoraria) as CargaHorariaTotal, C.NomeCurso, C.CursoId, A.Imagem
             from Curso C
                  inner join Disciplina D on D.CursoId = C.CursoId
                  inner join Area A on A.AreaId = C.AreaId

             GROUP BY C.CursoId
       "));

Eloquent

$Query = Curso::join('Disciplina', 'Disciplina.CursoId', '=', 'Curso.CursoId')
              ->join('Area', 'Area.AreaId', '=', 'Curso.AreaId')
              ->selectRaw('SUM(Disciplina.CargaHoraria) AS CargaHorariaTotal, Curso.NomeCurso, Curso.CursoId, Area.Imagem')
              ->groupBy('Curso.CursoId')
              ->get();

All fields that will return in AJAX you have to put in the $fillable variable.

protected $fillable = ['CursoId', 'AreaId', 'NomeCurso', 'DescricaoCurso', 'ImagemCurso', 'NumeroDoCurso', 'UsuarioId'];
    
22.12.2016 / 13:31