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

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

15 horas atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

23 horas atrás

CodeIgniter 4 tela branca: CI_ENVIRONMENT e o erro que sumiu

Página em branco no CodeIgniter 4, sem nenhuma mensagem? O ambiente está em production e escondeu o erro. Troque o…

2 dias atrás

Google Consent Mode v2 no WordPress: default denied antes do gtag rodar

O Google Ads acusa consentimento ausente porque o gtag sobe antes do banner. Veja como injetar o default denied do…

3 dias atrás

Módulos PHP 8.3 faltando na Saúde do site do WordPress: como instalar

A tela Saúde do site avisa que faltam extensões como intl, imagick ou zip: instale no PHP 8.3, reinicie o…

3 dias atrás

Caso de teste PHPUnit a partir do bug: do relato solto para o teste que falha

Chegou um chamado sem passo a passo e sem exemplo. Veja como virar esse relato em um caso de teste…

4 dias atrás