symfony

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

criteria
php
symfony

Comments (0)

Permalink

Logando o tempo de execução de um script com sfFileLogger

Neste post irei mostrar uma maneira de como logar o tempo de execução de um script qualquer.

// cria novo objeto de log

$logger = new sfFileLogger();

// inicio o logger e digo o lugar para gravar o arquivo
$logger->initialize(array(‘file’ => sfConfig::get("sf_log_dir").‘/tempos.log’));

// escrevendo no arquivo
$logger->log("Inicio do processamento X", 0, "Cliente");

// processamento
// aqui vem o código que possa levar algum tempo…

$logger->log("Fim de processamento", 0, "Cliente");

Você terá no log/tempos.log algo do tipo:

Mai 09 00:08:06 symfony [Cliente] Inicio do processamento X
Mai 09 00:08:22 symfony [Cliente] Fim de processamento

Ref: custom-file-logging-in-symfony-for-cron-jobs-or-more/

log
php
symfony

Comments (1)

Permalink

Alterando valores no app.yml dinamicamente

Suponha que você tenha o arquivo apps/frontend/config/app.yml ,

all:
  count: 10
 

e agora você quer atualizar este valor:


$config = sfYaml::load( sfConfig::get("sf_app_config_dir") . "/app.yml");
$config[‘all’][‘count’] = "20";
$yaml = sfYaml::dump($config);
file_put_contents( sfConfig::get("sf_app_config_dir") . "/app.yml" , $yaml);
 

Pronto. O app.yml estará com o novo valor.

É interessante limpar o cache depois de uma alteração desse tipo.

cache
php
symfony
yml

Comments (0)

Permalink

No package found for database “” in generated-schema.xml

Tive esse erro hoje pela manhã. O problema é que eu tinha um config/schema.xml definido pelo symfony propel-build-schema e isso estava dando conflito com o schema.yml vazio.

A solução é remover o schema.yml.


  rm -f config/schema.yml

Isso resolve o problema do symfony propel-build-schema + propel-build-sql

http://osterman.com/wordpress/2007/08/17/symfony-no-package-found-for-database-in-generated-schemaxml

php
schema
symfony

Comments (0)

Permalink

Limpando o cache sem precisar usar linha de comando (symfony cc)

Podemos limpar o cache do symfony sem precisar usar a linha de comando. Isso é útil pois alguns servidores não dão acesso para linha de comando (cli).


  // apaga todo o conteúdo do cache/
  sfToolkit::clearGlob(sfConfig::get(‘sf_root_cache_dir’));
  // apaga o conteúdo do cache/frontend
  sfToolkit::clearGlob(sfConfig::get(‘sf_root_cache_dir’).‘/frontend’);

PS: Isso só funcionou, pelo menos comigo, em servidor linux. No windows essa função não fez nada.

cache
php
symfony

Comments (2)

Permalink

Symsony sync funcionando no windows (How to get rsync working on windows)

Depois de ter instalado o rsync para windows (http://trac.symfony-project.com/wiki/SymfonySyncOnWindows) e te-lo no PATH, vai ser preciso fazer uma alteração em um arquivo do symfony.

Edite o arquivo data/symfony/tasks/sfPakeEnvironment.php e troque a linha

echo pake_sh($cmd);

por

echo pake_sh(‘start cmd /k ‘.$cmd);

Esse problema foi mencionado aqui: http://www.symfony-project.org/forum/index.php/m/40902/

php
symfony

Comments (0)

Permalink

Criteria para pegar emails duplicados

Visto que temos uma tabela clientes, com o campo email e queremos pegar os emails duplicados e listá-los.


  $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>1’, Criteria::CUSTOM));
  $c->addDescendingOrderByColumn(COUNT);
  $rs = ClientePeer::doSelectRS($c);

  while ($rs->next()) {

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

  • Pronto, você tem um array $duplicados[“email”] = quantidade

criteria
php
symfony

Comments (0)

Permalink

Simulando coluna do banco com YML

Olá!

Vou mostrar aqui uma maneira de nós criarmos uma coluna no banco que servirá como várias colunas.

schema.yml


propel:
  usuario:
    _attribute:          { phpName: Usuario }
    id:
    nome:               varchar(50)
    sobrenome:          varchar(50)
    atributos:          longvarchar

Então, se alguma hora precisarmos criar algum campo a mais nesta tabela, podemos utilizar o campo atributos para isso.
Suponhamos que preciso criar um campo ESTADO.

lib/model/Usuario.php


  public function getEstado() {
        $yml_loaded = sfYaml::load($this->getAtributos());

        if (!(isset($yml_loaded[‘estado’]))) {
        $yml_loaded[‘estado’] = ‘’;
        }
        return $yml_loaded["estado"];
  }

  public function setEstado($valor) {
    $yml_loaded = sfYaml::load($this->getAtributos());
    $yml_loaded[‘estado’] = $valor;
    $yml = sfYaml::dump($yml_loaded);
    $this->setAtributos($yml);
  }

Desse jeito, teremos o valor do estado armazenado na coluna atributos do banco.
Na minha opinião é mais fácil criar esses métodos do que ficar alterando colunas do banco, porém o tipo de campo será sempre string.

php
symfony

Comments (0)

Permalink

Selecionar colunas específicas com Criteria

Quero selecionar somente as colunas ID e EMAIL da tabela assinante. Sendo assim:


    $c = new Criteria();
    $c->clearSelectColumns();
    $c->addSelectColumn(AssinantePeer::ID);
    $c->addSelectColumn(AssinantePeer::EMAIL);
    $userRes = AssinantePeer::doSelectRS($c);

Reparem que foi utilizado o método doSelectRS.
Para percorrer o RecordSet, faça da seguinte maneira:


while ($userRes->next()) {
   $array[$userRes>get(1)] = $userRes>get(2);
}

Ou seja, o método $userRes->get(1) me dá a primeira coluna selecionada (ID) , o $userRes->get(2) a segunda e assim sucessivamente..
Eu poderia ter usado também os métodos $userRes->getString(“ID”) e $userRes->getString(“EMAIL”)

=)

php
symfony

Comments (1)

Permalink

Melhores práticas para programar em symfony (Coding Standards)

Práticas

  • Nunca usar tabulação nos códigos. A indentação é sempre feita com 2 espaços em branco.
  • Não colocar espaços depois de abrir e fechar parenteses.

 if ($reqvalue _getRequestValue($name))    correto
 if ( $reqvalue _getRequestValue($name) )  incorreto
 
  • Usar camelCase, e não underscores, para variáveis, funções e nomes de métodos, exeto para nomes de helpers.
  • Chaves sempre tem uma linha única só para elas.
  • Não termine arquivos de bibliotecas (lib/) com o tradicional ?>. Ele na verdade não é obrigatório e caso venha a ter algum espaço depois (”?> “) ocorrerá erro.
  • No corpo das funções é bom que o “return” tenha um destaque para melhorar a leitura. Para isso, deixe uma linha em branco antes dele.

function fooFunction() {
  if (condition2 || condition3) {
    statement1;
    statement2;    

    return 1;
} else {
    defaultaction;
}
  return null;
}
  • Os comentarios de uma linha devem vir sempre desse jeito

// primeiro espaço, sem quebra de linha se ficar longo`

  • Evitar de tratar variáveis dentro de strings.

$string = ‘algo’;
$new_string = "$string é legal!";   // ruim
$new_string = $string . ‘ é legal!’; // melhor
 

php
symfony

Comments (3)

Permalink