"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Classificando linhas com valores vazios na parte inferior e valores não vazios em ordem decrescente no Laravel

Classificando linhas com valores vazios na parte inferior e valores não vazios em ordem decrescente no Laravel

Publicado em 2024-11-06
Navegar:156

Sorting Rows with Empty Values at the Bottom and Non-Empty Values in Descending Order in Laravel

Ao trabalhar com bancos de dados, é comum encontrar situações em que alguns campos podem estar vazios ou NULOS. Um desafio que surge frequentemente é como classificar os registros de modo que as linhas com campos vazios apareçam na parte inferior do conjunto de resultados, enquanto aquelas com valores não vazios sejam ordenadas de maneira significativa (por exemplo, em ordem decrescente). Neste post vou mostrar como fazer isso no Laravel usando um exemplo prático.

Cenário

Digamos que você tenha uma tabela de participantes para uma atividade e cada participante pode ou não ter um carimbo de data/hora comparecido_at, que registra quando o participante participou da atividade. Você deseja listar todos os participantes, classificando-os de forma que:

  • Os participantes que compareceram (ou seja, compareceu_em não está vazio) aparecem primeiro, classificados pela participação mais recente.
  • Os participantes que não compareceram (ou seja, compareceu_em está vazio ou NULO) aparecem por último.

O problema

Por padrão, o método last() do Laravel classifica os registros por uma determinada coluna em ordem decrescente. No entanto, ele não trata o caso em que alguns registros possuem valores NULL ou vazios. Se você simplesmente usar:

return $this
    ->participants()
    ->with('user')
    ->latest('attended_at')
    ->get();

Ele ordenará os participantes com um carimbo de data/hora, mas não moverá os valores NULL para o final.

A solução: usando orderByRaw

Podemos obter a classificação desejada usando o método orderByRaw(). Isso nos permite escrever lógica de classificação personalizada usando expressões SQL brutas. Nesse caso, ordenaremos se atendeu_at é NULL e, em seguida, ordenaremos por atendeu_at em ordem decrescente para valores não NULOS.

Veja como você pode escrever esta consulta no Laravel:

return $this
    ->participants()
    ->with('user')
    ->orderByRaw('attended_at IS NULL, attended_at DESC')
    ->get()
    ->map(function (ActivityParticipant $participant) {
        return [
            'metric_number' => data_get($participant, 'user.student_id'),
            'name' => data_get($participant, 'user.name'),
            'status' => data_get($participant, 'status'),
            'attended_at' => data_get($participant, 'attended_at', '-'),
        ];
    })->toArray();

Dividindo a consulta

  • orderByRaw('attended_at IS NULL, participou_at DESC'):
    • atendeu_at É NULO: retornará verdadeiro (ou 1) para linhas onde atendeu_at é NULO e falso (ou 0) caso contrário. Isso efetivamente coloca valores NULL na parte inferior.
    • atendeu_at DESC: Depois de manipular os valores NULL, classifica as linhas restantes com valores não vazios frequent_at em ordem decrescente, o que significa que o comparecimento mais recente será mostrado primeiro.

Resultado Final

A função map() é então usada para formatar a saída na estrutura desejada, incluindo campos como student_id, nome e status, e converter o carimbo de data/hora comparecido_at em um formato legível por humanos ou '-' se for vazio.

Benefícios desta abordagem

  • Desempenho: Esta abordagem aproveita os recursos de classificação do SQL, tornando-o eficiente para grandes conjuntos de dados.
  • Legibilidade: Usar orderByRaw() com uma expressão SQL bruta mantém o código conciso e fácil de entender.
  • Flexibilidade: Você pode facilmente estender essa lógica para classificar por outros campos ou incluir condições mais complexas.

Conclusão

Lidar com a classificação com valores NULL ou vazios no Laravel é uma tarefa comum ao trabalhar com dados que nem sempre estão completos. Ao usar o método orderByRaw() com uma expressão SQL como atendeu_at IS NULL, atendeu_at DESC, você pode facilmente garantir que as linhas com valores NULL apareçam na parte inferior enquanto ainda classifica o restante dos dados de maneira significativa.

Este método é especialmente útil em cenários onde você está lidando com atendimento, como mostrado neste exemplo, mas pode ser aplicado a muitas outras situações onde alguns campos de dados podem estar faltando. Com essa abordagem, você pode fornecer aos seus usuários uma exibição mais clara e intuitiva dos registros em seu aplicativo.

Boa codificação!

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/nasrulhazim/sorting-rows-with-empty-values-at-the-bottom-and-non-empty-values-in-decrescente-order-in-laravel- 2ao9? 1Se houver alguma violação, entre em contato com [email protected] para excluí-la.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3