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.
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:
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.
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();
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.
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!
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