[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)

dificuldae para fazer um filtro direto na query builder

[Finalizado Pelo Aluno]

Ubiratan Lima
Criador Ubiratan Lima 14/01/2024

Preciso fazer um filtro direto no código... Pretendo pegar o campo tempo e somá-lo mas dentro do mes corrente... cheguei perto... mas não deu certo.
Meu código abaixo:

$atendimentos_user_mes = DB::table('atendimentos')
                ->join('users','atendimentos.id_profissional','=','users.id')
                ->select(
                    'atendimentos.*',
                    'users.name as nome_profissional',
                    )
                ->select(DB::raw('SUM(tempo) as total'))
                ->where('atendimentos.id_profissional','=','100')
                ->get();

            dd($atendimentos_user_mes);

 

o filtro pelo ID(100) e a soma funcionam certinho. mas quando vou colcoar o query:

->where('data','=','01') onde a 'data' é o campo data realmente no formato Y-m-d, onde preciso que ele fique no formato apenas do mês 'm', e o '01' é a data atual date('m'), no debug a data atual vem certinha, mas estou com dificuldade de tratar a data ja cadastrada no campo data do banco, que está em Y-m-d e não apenas no formato m.

O Resultado da query é o total do campo tempo por usuário e mes.

 

Criador Ubiratan Lima 14/01/2024

o que eu tentei fazer foi o seguinte:

criei uma variável
$mes_atual = date('m');
debuguei e veio exatamente o que quero: 01

Agora a dificuldade está sendo transformar o campo data apenas no mes...

->where(date('m','data'),'=',$mes_atual);

essa formatação do php não está funcionando dentro da query e eu não sei como fazer esse tratamento.

Ubiratan Lima
Criador Ubiratan Lima 14/01/2024

consegui fazer a primeira conversão... eita forum mágico... é escrever aqui e o conhecimento aparece... método HOMER na veia...
mas ainda não consegui o resultado final

->select(DB::raw('DATE_FORMAT(data, "%Y-%m") as date'))

 

Ubiratan Lima
Manager Carlos Ferreira 14/01/2024

Olá, Ubiratan!

Como vai?

 

Que bom que conseguiu, meus parabéns!

 

Se ainda tiver dúvidas, poste aqui que te ajudo a resolver.

Carlos Ferreira
Criador Ubiratan Lima 14/01/2024

Boa noite Professor, tudo bem?

Sim ainda continuo com a dificuldade, de fazer o filtro.
Não estou conseguindo fazer o filtro responder corretamente.

o que eu preciso fazer é que retorne todos os valores do mês 01 por exemplo por profissional.
nesse linha:

->select(DB::raw('DATE_FORMAT(data, "%Y-%m") as date'))

Eu pego a data certinho de como quero que apareça (2024-01)
Agora eu preciso colocar ela na condição que só apareça na lista enquanto está dentro desseperiodo, ou seja, se passar para fevereiro, não conta mais.

$teste = DB::table('atendimentos')
                ->where('id_profissional','=',$id)
                ->select(DB::raw('SUM(tempo) as total'))
                ->select(DB::raw('DATE_FORMAT(data, "%Y-%m") as date'))
                ->get();

 

Esse trecho acima só funciona com um DB::raw os dois não funcionam juntos.

Estou nesse impasse filtrar a data e trazer o total dentro do id do profissional.

abaixo a migrate:

Schema::create('atendimentos', function (Blueprint $table) {
            $table->id();
            $table->string('data');
            $table->string('hora');
            $table->string('id_profissional');
            $table->string('id_paciente');
            $table->string('id_sala');
            $table->string('detalhes')->nullable();
            $table->string('tempo');
            $table->string('ocorrencia')->nullable();
            $table->enum('status',['active','inactive']);
            $table->timestamps();
        });

 

 

Ubiratan Lima
Criador Ubiratan Lima 14/01/2024

Considere na migrate que ja acertei o tipo do campo tempo. que agora é inteiro. (integer)

Ubiratan Lima
Criador Ubiratan Lima 14/01/2024

Gratidão. consegui resolver hoje com essa linha:
SELECT * FROM projeto_relig.atendimentos WHERE MONTH(data) = $mesatual;

Bora para outro desafio. rsrsrs

Ubiratan Lima
Manager Carlos Ferreira 14/01/2024

Olá, Ubiratan!

 

É possível filtrar por mês, de forma mais fácil, exemplo:

$mes = 1;  // Janeiro

$ano = 2024;

$dia = 16;

 

$resultados = SeuModel::whereYear('sua_coluna_data', $ano)

                       ->whereMonth('sua_coluna_data', $mes)

                       ->whereDay('sua_coluna_data', $dia)

                       ->get();

Carlos Ferreira
Criador Ubiratan Lima 14/01/2024

Gratidão. bora pra frente. woohoo...!

Ubiratan Lima
Criador Ubiratan Lima 14/01/2024

Estou com outra dificuldade, e nem sei se da para fazer isso...
Não encontrei nenhum exemplo proximo:

$fatura->qtd_atendimentos = DB::table('atendimentos')
            ->join('users','atendimentos.id_profissional','=','users.id')
            ->selectRaw('users.name as profissional_name')
            ->where('atendimentos.status','=','active')
            ->where('users.profile','=','profissional')
            ->groupBy('id_profissional')
            ->get();

 

esse código volta certinho o que queria, mas eu preciso acrescentar

            ->sum('atendimentos.tempo')

 

Mas sempre retorna o erro da linha abaixo, Call to a member function get() on float, independente de onde insiro a query.

O Resultado da query deveria ser assim:

{

"id_profissional": "1"

"qtd_atendimentos": 5 - o count resolveu porque cada atendimento é igual a 1

"profissional_name": "Dr. Madalyn Bailey"

"tempo": "8" -> Aqui é o inteiro ja registrado na coluna tempo do banco. aqui não consigo utilizar o count porque o tempo varia mas é sempre inteiro.

}

Em Resumo, preciso apenas somar essa coluna agrupada e não estou conseguindo de forma alguma.

 

 

 

 

Ubiratan Lima
Criador Ubiratan Lima 14/01/2024

Bom dia Professor.
Caso resolvido com o código abaixo:

$fatura->qtd_atendimentos = DB::table('atendimentos')
            ->select(DB::raw('SUM(tempo) as tempo_total')) ------ SOLUÇÃO
            ->join('users','atendimentos.id_profissional','=','users.id')
            ->selectRaw('id_profissional, count(*) as qtd_atendimentos')
            ->selectRaw('users.name as profissional_name')
            ->where('atendimentos.status','=','active')
            ->where('users.profile','=','profissional')
            ->groupBy('id_profissional')
            ->get();

Eu precisava fazer um select antes do Join.
Como ja tinha dito... o segredo parece ser em te chamar... Professor TELEPATA!!! rsrsrs...

Gratidão.



 

 

 

Ubiratan Lima
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!