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

Block pattern não aparece no inseridor: registre pelo arquivo em /patterns

Padrão registrado no functions.php que não aparece na aba Padrões. O caminho curto do WordPress 6.9: um arquivo PHP na…

7 horas atrás

Tamanho das tabelas MySQL 8: a query que acha o vilão do disco

Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…

13 horas atrás

CodeIgniter 3 PHP 8.3: os erros fatais que aparecem logo no boot

Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…

2 dias atrás

rsync do pub/media no Magento 2: copiar as imagens sem levar o cache

Metade do seu pub/media é miniatura descartável. Veja o rsync com os excludes certos e o comando que reconstrói o…

2 dias atrás

mu-plugins no WordPress: onde colocar snippets em vez do functions.php

Tire os snippets do functions.php e coloque num must-use plugin: carrega sempre, sobrevive à atualização do tema e ninguém desativa…

3 dias atrás

preg_replace_callback no PHP: substituir cada match com uma função

Quando o valor novo depende do que a regex achou, preg_replace não resolve. Exemplo real aplicando 10% de desconto em…

4 dias atrás