Depois de procurar bastante, consegui descobrir como executar qualquer tipo de consulta usando o ORM Doctrine.

Eu precisava usar algumas funções específicas do PostgreSQL, o Doctrine não implementa todas as funções do PostgreSQL, o Doctrine faz isso para manter a compatibilidade entre todos os banco de dados que ele dá suporte. Algumas funções só funcionam em um determinado banco de dados.

O exemplo que eu vou ilustrar abaixo foi construído em cima do framework symfony, mas deve ser muito semelhate se você estiver trabalhando direto com o Doctrine.

O Doctrine foi construído em cima do PDO (http://br.php.net/manual/pt_BR/book.pdo.php), desta forma nós podemos pegar a instância do Doctrine e realizar uma consulta usando o PDO.

Por exemplo:


$manager = Doctrine_Manager::getInstance();
$dbh = $manager->getCurrentConnection();

$sql = "SELECT sua_funcao_do_banco(?)";

$sth = $dbh->prepare($sql);
$sth->execute(array(10));
$r = $sth->fetch(PDO::FETCH_ASSOC);

Vamos entender como tudo funciona:


$manager = Doctrine_Manager::getInstance();
$dbh = $manager->getCurrentConnection();

O código acima pega a conexão atual com o banco de dados e usa ela para fazer a consulta.


$sql = "SELECT sua_funcao_do_banco(?)";

O SQL que você quer executar, pode ser qualquer sql que rode no seu banco de dados. Note o “?” esse cara informa que será passado um parâmetro.


$sth = $dbh->prepare($sql);
$sth->execute(array(10));
$r = $sth->fetch(PDO::FETCH_ASSOC);

Essas linhas preparam o SQL, executando e substituindo o “?” do SQL pelo valor no array, no caso array(10).

Por fim é executando o fetch para pegar apenas um resultado, se a consulta retorna-se mais que um resultado você poderia fazer um fetchAll.

A linha PDO::FETCH_ASSOC informa como você quer que os dados sejam retornados em array, objeto e outros. Dá uma olhada aqui: http://br.php.net/manual/pt_BR/pdostatement.fetch.php

Pronto! Agora e só usar a variável $r para trabalhar com os dados retornados da consulta.

Leave a Reply