Migrations - Mantendo o banco de dados atualizado

Escrevendo sub queries com o active record

Às vezes algumas aplicações exigem queries mais complexas para obtenção dos dados, e pode ser que seja necessário criar sub queries para obter os dados necessários.

O CodeIgniter não tem suporte nativo a sub queries, mas vou dar uma dica pra você de como criar sub queries de forma rápida e fácil.

Veja a instrução SQL a seguir:

SELECT * FROM contatos WHERE id IN(SELECT id FROM bkp_contatos);

Essa query vai retornar todos os dados da tabela ‘contatos’ que também estiverem na tabela ‘bkp_contatos’. Você poderia usar a sintaxe abaixo para executar essa query no CodeIgniter, e depois rodar um foreach, por exemplo, para interagir entre os dados.

$query = $this->db->query('SELECT * FROM contatos WHERE id IN(SELECT id FROM bkp_contatos)');

Mas vou te mostrar uma outra forma de trabalhar com sub queries. Veja no código abaixo a implementação da sub query usando os métodos do active record.

// Sub Query
$this->db->select('id')->from('bkp_contatos');
$subQuery =  $this->db->get_compiled_select();
 
// Query
$this->db->select('*')
         ->from('employees')
         ->where("id IN ($subQuery)", NULL, FALSE)
         ->get()
         ->result();

O código acima está separado em 2 partes. A primeira é a instrução da sub query, usando os métodos ‘select’ e ‘from’, em seguida é utilizado o método ‘get_compiled_select’. Esse método faz com que ao invés da queery ser executada, ela seja retornada em formato string, que seria “SELECT id FROM bkp_contatos”. Essa string retornada é armazenada em uma variável chamada ‘$subQuery’, que será utilizada na montagem da query principal.

A query principal é como qualquer outra, mas o método ‘where’ recebe parâmetros adicionais.

O primeiro parâmetro identifica o nome do campo, ou até mesmo a string da cláusula WHERE, mas também pode ser um array associativo.

O segundo parâmetro é o valor a ser comparado no campo informado no primeiro parâmetro, mas nesse caso ele recebe NULL, pois a comparação já está sendo feita diretamente no primeiro parâmetro, como uma string, onde usamos “id IN ($subQuery)” para concatenar a string da sub query.

O terceiro parâmetro é um booleano que vai determinar se os valores passado devem ser escapados ou não. Como não foi passado nenhum valor no segundo parâmetro, então ele recebe FALSE.

Com essa dica você poderá utilizar sub queries de todo grau de complexidade junto das suas queries principais, mantendo o código organizado e fácil de ser compreendido.

Bons Estudos!