
Resultado vazio, nenhum erro na tela e a suspeita de sempre: qual WHERE esse builder montou, afinal? Em CodeIgniter 4 dá pra ver a consulta duas vezes. Antes de executar, com getCompiledSelect(false). Depois de executar, com getLastQuery() na conexão. Comparar as duas costuma matar o problema em dois minutos.
<?php
$db = ConfigDatabase::connect();
$builder = $db->table('pedidos');
$builder->select('id, cliente_id, total, criado_em')
->where('status', 'pago')
->where('criado_em >=', '2026-08-01')
->orderBy('criado_em', 'DESC')
->limit(20);
// o false e o que importa: nao zera o builder
log_message('debug', 'SQL montado: ' . $builder->getCompiledSelect(false));
$pedidos = $builder->get()->getResult();
// ja executado, com os binds aplicados
log_message('debug', 'SQL rodado: ' . $db->getLastQuery()); Sai tudo em writable/logs/log-2026-08-31.log. Se o arquivo não ganhar linha nenhuma, o corte está no $threshold de app/Config/Logger.php: debug é o nível 8, e threshold 4 só grava até error. Para olhar na hora, troque log_message por echo e um exit logo abaixo — sem o exit a página segue e o SQL some no meio do HTML.
A assinatura é getCompiledSelect(bool $reset = true). Chamando sem argumento, ele imprime a consulta certinha e limpa o builder logo em seguida. O get() da linha de baixo então roda um SELECT * FROM pedidos pelado, sem WHERE, sem LIMIT. Você olha o log, vê o SQL correto, olha o resultado e vê a tabela inteira — e passa a tarde procurando bug onde não tem. Passe false sempre que for continuar usando aquele builder.
O getLastQuery() devolve um objeto Query, não uma string; ele vira texto no __toString, já com os valores no lugar das interrogações. Dentro de um Model você chega nele por $this->db->getLastQuery(). E existem os irmãos getCompiledInsert() e getCompiledUpdate(), que salvam a vida quando o UPDATE resolve atualizar a tabela toda.
Com o ambiente em development, a aba Database do Debug Toolbar já lista cada consulta da requisição com o tempo de execução. Serve pra achar a query, mas o log continua sendo o único jeito de flagrar o builder zerado antes da hora.
Pare de pedir checkbox para tudo no checkout: mapeie campo a campo qual base legal do artigo 7º sustenta cada…
Perdeu o acesso ao painel e o e-mail de recuperação não chega? Troque a senha do administrador em dois comandos…
Saia do navegador e chame a API direto do seu código: um ia.php com curl_init, os headers certos e json_encode,…
Site novo há semanas e nenhuma página indexada? Confira a caixinha de visibilidade em Leitura, o noindex no HTML e…
O retorno do array_map voltou com índice 0, 1, 2 e o código que dependia da chave quebrou. Entenda quando…
Dump de 12 GB que demora horas porque arrasta report_event e cron_schedule. Faça o backup em duas passadas, guarde só…