Codeigniter

Query Builder do CodeIgniter 4: ver o SQL que ele realmente gerou

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.

Antes e depois, no mesmo trecho

<?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 pegadinha do reset

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.

Post Recentes

Base legal da LGPD no checkout: o que é contrato e o que exige consentimento

Pare de pedir checkbox para tudo no checkout: mapeie campo a campo qual base legal do artigo 7º sustenta cada…

2 dias atrás

wp user update: resetar a senha do admin do WordPress pelo terminal

Perdeu o acesso ao painel e o e-mail de recuperação não chega? Troque a senha do administrador em dois comandos…

2 dias atrás

Chamar API de IA com cURL no PHP 8.3: o script mínimo que já funciona

Saia do navegador e chame a API direto do seu código: um ia.php com curl_init, os headers certos e json_encode,…

3 dias atrás

WordPress não aparece no Google: noindex esquecido e robots.txt virtual

Site novo há semanas e nenhuma página indexada? Confira a caixinha de visibilidade em Leitura, o noindex no HTML e…

4 dias atrás

array_map perde as chaves do array no PHP: como manter o índice

O retorno do array_map voltou com índice 0, 1, 2 e o código que dependia da chave quebrou. Entenda quando…

5 dias atrás

Backup do Magento 2 com mysqldump: dump leve sem as tabelas de log

Dump de 12 GB que demora horas porque arrasta report_event e cron_schedule. Faça o backup em duas passadas, guarde só…

5 dias atrás