3
respostas

Como fazer um select dependendo de algumas condições que vem por parametros no laravel 4.2?

Eu tenho uma rota que recebe o ano e mês para buscar algumas informaçoes no banco.

Quando não vier o mês eu preciso que seja feita a soma de todos os meses do ano solicitado.

if($month == 0){
    $dbRegister = DB::table('tb_data')->select(DB::raw("SUM(tb_data.total_points) as total_points"));
}else{
     $dbRegister = DB::table('tb_data')->select('tb_data.total_points');
}

$dbRegister->select(DB::raw('tb_data.user)....

Se eu deixo o select separado dessa forma ele não funciona. Alguem saberia me dizer?

Obrigada :D

3 respostas

Que tal assim:

public function determinarPeriodo($month = null) : integer;

public function somarPontos($periodo) : integer;

O método determinarPeriodo retorna a quantidade de meses a somar: 1 a 12.

O método somarPontos sempre soma com sum(tb_data.total_points).

Dessa forma evita um método que faz coisas demais, divide a responsabilidade, e ainda se prepara pra um eventual cliente pedir "agora quero calcular 5 meses, ou 7 meses do ano".

Mas ainda quando eu cair no metódo que busca as informações eu vou precisar saber quando fazer o sum e quando somente retornar o valor de apenas um mês.

O que eu queria evitar era ter que duplicar esse metódo ja que ele é todo praticamente igual

Fazendo da forma indicada, você tem só 1 consulta ao banco pois sempre vai somar um intervalo de 1 a 12 meses, sem código duplicado.

public function determinarPeriodo($from, $month = null) {
    // if month null, month = 12

    retorna from + month no formato DATETIME
}
public function somarPontos(Request $request) {
    $from = que vem de algum campo do Request
    $to = $this->determinarPeriodo($from, $request->get('month'));

    // e faz a soma...
    DB::table('tb_data')
        ->whereBetween('date', [$from, $to])
        ->selectRaw('sum(tb_data.total_points)')
        ->selectRaw('campos...')
        ->groupBy('id')
        ->get(); 
}