Symfony + Criteria! Snippets e dicas

De vez em quando é chato fazer uns selects um pouco mais complexos com criteria… Ai vão algumas dicas..

Executando uma subquery

@author: Patrice Blanchardie

$c = new Criteria();
$c->addAsColumn(’group_name’, ‘(SELECT group.group_name FROM group WHERE group.id=group_id));
$c->addAscendingOrderByColumn($c->getColumnForAs(’group_name’));
$this->users = UserPeer::doSelect($c);

Criando um order by customizado

@author: Eric Delord

$c = new Criteria();
//order by numa coluna com o Order customizado para o campo específico
$c->addAscendingOrderByColumn( sprintf(”FIELD(%s,%s)”, CustomPeer::ID, “10,11,12,13?) );

Criando um range entre datas

@author: Francois Zaninotto

$c = new Criteria();
$criterion = $c->getNewCriterion(FooPeer::CREATED_AT , date(’Y-m-d’, $from_date), Criteria::GREATER_EQUAL ); // maior que
$criterion->addAnd($c->getNewCriterion(FooPeer::CREATED_AT , date(’Y-m-d’, $to_date), Criteria::LESS_EQUAL )); // menor que
$c->add($criterion);
$shows = FooPeer::doSelect($c);

Executando update em algumas linhas

@author: Francois Zaninotto


// Esse snippet usa o doUpdate padrão criado no lib/model/om/xxxPeer.php
// BasePeer::doUpdate($select_criteria, $update_criteria, $connection);

$con = Propel::getConnection();

// select from…
$c1 = new Criteria();
$c1->add(FooPeer::ID, $foo_id);

// update set
$c2 = new Criteria();
$c2->add(FooPeer::PROPERTY, 5);

BasePeer::doUpdate($c1, $c2, $con);

Comparando dois campos de uma mesma linha

@author: Francois Zaninotto

$c = new Criteria();
$c->add(FooPeer::COLUMN1, FooPeer::COLUMN1.’>=’.FooPeer::COLUMN2, Criteria::CUSTOM); // criteria custom

Pegando campos duplicados

// Exemplo com a tabela Cliente e campo Email
// O criteria agrupa os emails e conta

$c = new Criteria();
$c->clearSelectColumns();
$c->addSelectColumn(ClientePeer::EMAIL);
$c->addGroupByColumn(ClientePeer::EMAIL);
$c->addAsColumn(‘numduplicados’, ‘COUNT(’.ClientePeer::EMAIL.‘));
$c->addHaving($c->getNewCriterion(ClientePeer::EMAIL, ‘COUNT(cliente.EMAIL)>1‘, Criteria::CUSTOM));
$c->addDescendingOrderByColumn(‘COUNT’);
$rs = ClientePeer::doSelectRS($c);

while ($rs->next()) {

$duplicados[$rs->get(1)] = $rs->get(2);
}

Post: http://www.symfonybr.com/2008/03/13/criteria-para-pegar-emails-duplicados/

Randomizando resultados de um select

@author: Romain Dorgueil

$c = new Criteria()
$result = FooPeer::doSelect($c);
// A função shuffle() randomiza a ordem dos elementos dentro do array
shuffle($result);

Referências e manuais da classe Criteria

http://propel.jondh.me.uk/ – Converte pseudo-SQL para código PHP
http://www.cpr.in-berlin.de/mirror/symfony-project.com/api-0.6.3/classCriteria.html – Referência da classe Criteria
http://andreiabohner.files.wordpress.com/2008/01/sfmodelcriteriacriterionrsrefcard_enus.pdf – Cheat sheet

Ref: http://www.symfony-framework.com/2008/06/01/criteria-snippets-tools-links-and-suggestions