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:
1
2
3
4
5
6
7
8
9
|
$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:
1
2
3
|
$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.
1
2
|
$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.
1
2
3
4
|
$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.