Archive for the ‘Doctrine’ Category

Método findAll do ORM Doctrine não permite ordenação

Postado em 05 jan 2009
Categoria(s) Doctrine

Diariamente eu trabalho com o framework symfony 1.1 usando como ORM o Doctrine, mas são muitas as decepções com o Doctrine. Ele não é um ORM que propícia um desenvolvimento ágil.

Hoje eu precisei fazer uma consulta retornando todos os registros da tabela e ordenando pelo nome, tentei usar o método findAll do Doctrine, mas ele não permite informar uma coluna para ordenação, ou seja, o básico do básico ele não faz muito bem. Onde fica o desenvolvimento ágil em tudo isso? :-( Precisei fazer uma gambiarra usando o método findByDql para conseguir realizar a minha consulta.

Eu pretendia fazer algo do tipo:

1
2
3
4
5
6
7
8
9
$states = Doctrine::getTable('DState')->findAll()->orderBy('short');
 
ou
 
$states = Doctrine::getTable('DState')->orderBy('short')->findAll();
 
ou
 
$states = Doctrine::getTable('DState')->findAll(array('order' => 'short'));

Nada disso funciona, o método findAll não consegue trabalhar com ordenação. Não vejo vantagens em usar esse método se não posso trabalhar com a ordenação dos resultados.

Tive que fazer a seguinte gambiarra usando o método findByDql para conseguir executar a consulta de forma mais prática e ágil:

1
$states = Doctrine::getTable('DState')->findByDql('id is not null order by short');

Eu precisei criar um where que funciona para tudo e depois especificar a ordenação.

  • Share/Bookmark

A Falta de padronização dos retornos dos métodos de consulta do ORM Doctrine são irritantes

Postado em 05 dez 2008
Categoria(s) Doctrine

A Falta de padronização dos retornos dos métodos de consulta do Doctrine são irritantes, no ORM Doctrine as consultas realizadas com Doctrine_Query e o método findByDql retornam valores diferentes.

O Doctrine_Query retorna false, caso não satisfaça a condição where, já o método findByDql retorna um array vazio.

Essa falta de padronização é muito ruim.

Por exemplo:

1
2
3
4
$q = new Doctrine_Query();
$q->from('Status')->where('name = ?', 'exemplo');
$r = $q->execute();
var_dump($r);

Essa forma de consulta retorna false, caso name = ‘exemplo’ não exista. Eu acho esse retorno correto, ou null.

Mas o método findByDql tem um retorno fora de padrão, retornando um array vazio.

Por exemplo:

1
2
$status = Doctrine::getTable('Status')->findByDql("name = 'exemplo'");
var_dump($status);

O ruim é ter que usar essas tecnologias despadronizadas. :-(
Mais um ponto negativo para o Doctrine.

  • Share/Bookmark

Executando qualquer tipo de consulta no Doctrine

Postado em 07 mai 2008
Categoria(s) Doctrine

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.

  • Share/Bookmark