Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal,
Estou tentando rodar uma consulta usando o Db_Table mas não está dando certo.
Eu tenho o seguinte SQL:
SELECT queries . * , MAX( queries.id ) AS id2
FROM queries
GROUP BY userId
ORDER BY id2 DESC
LIMIT 12
Ele funciona perfeitamente quando rodo no phpMyAdmin.
No ZF estou tentando criar esse mesmo SQL da seguinte forma:
$resultSet = $this->getDbTable()->fetchAll($this->getDbTable()->select('queries.*, MAX(`queries.id`) AS `id2`')->group('userId')->order('id2 DESC')->limit(12));
Porém, retorna o seguinte erro:
>
Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id2' in 'order clause'
Alguém sabe o que estou fazendo de errado?
Outra coisa, como faz pra debugar as consultas SQL no ZF? Eu dei uma pesquisada e não consegui encontrar. Falaram pra habilitar o FirePHP, mas ele não mostra o SQL. O que eu quero é poder ver como o ZF está montando o SQL.
Obrigado.
-----------------------------------------------
EDIT:
Dei uma simplificada na consulta e acabou funcionando.
SQL:
SELECT * , MAX( id )
FROM queries
GROUP BY userId
ORDER BY id DESC
LIMIT 12
ZF:
$resultSet = $this->getDbTable()->fetchAll($this->getDbTable()->select('*, MAX(`id`)')->group('userId')->order('id DESC')->limit(12));
Até imagino porque estava dando erro antes, porque neste caso como estou trabalhando com apenas uma tabela não era necessário usar o nome da tabela nos campos (exemplo queries.*), e quando trabalha com mais de uma tabela é necessário informar ao ZF o nome do alias da tabela. Foi uma falha boba minha.
Mas ainda continuo com dúvida de como debugar isso? Alguém sabe como capturar o SQL gerado pelo ZF?
Tiare,
Testei dessa forma e deu erro.
Código:
$resultSet = $this->getDbTable()->fetchAll($this->getDbTable()->select('*, MAX(`id`)')->group('userId')->order('id DESC')->limit(12));
Zend_Debug::dump($resultSet->__toString());
Erro:
Fatal error: Call to undefined method Zend_Db_Table_Rowset::__toString() in F:\htdocs\notfollow\application\models\QueryMapper.php on line 62
--------------------------------
EDIT:
Depois de vários testes eu vi que a solução que eu tinha encontrado não estava funcionando como eu esperava, então pesquisei mais na documentação e finalmente consegui resolver.
O código final ficou assim:
$tableName = $this->getDbTable()->info(Zend_Db_Table_Abstract::NAME);
$resultSet = $this->getDbTable()->fetchAll($this->getDbTable()->select()->from($tableName, array('*', 'MAX(`id`) AS id2'))->group('userId')->order('id2 DESC')->limit(12));
No caso eu voltei a usar o alias "id2" pra guardar o valor de MAX('id') e passei os campos no método *from* que é o correto, antes eu estava passando no método *select* e por isso não funcionava.
Com relação ao debug continuo sem saber como fazer. /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/natal_tongue.gif&key=dbeb4cfcc56db631d65f6d622e53ea2d63a24e25479a3c6a4af0dbb6b92b5fd3" alt="natal_tongue.gif" />
Agora que percebi :D, a função toString() pertence a class select();
$select = $this->getDbTable()->select('*, MAX(`id`)')->group('userId')->order('id DESC')->limit(12);
Zend_Debug::dump($select->__toString());
tenta novamente. Confirma depois se você consegui, se não quando eu chegar em casa eu olho novamente o método que acessa o toString();Deu o mesmo erro de antes amigo.
Essa variável $select está recebendo a mesma coisa que a variável $resultSet, só mudou de nome. hehe
Uma forma mais limpa de fazer consulta utilizando algum comando SQL dentro dela é utilizar Zend_Db_Expr(). Algo assim, para o seu caso:
$select = $this->getDbTable()->select(array('*', 'id2' => new Zend_Db_Expr('MAX(id)')))->group('userId')->order('id DESC')->limit(12);
Não testei aqui, então pode ter algum erro de sintaxe, porque digitei direto aqui no fórum, mas a ideia é esta.
Carlos Eduardo
Eu estou montando um exemplo aqui com o debug já posto ele.
Opa, cara eu montei o exemplo e agora não to achando, Mas para não ficar sem uma resposta da uma olhada eu achei no manual da zend:
http://framework.zend.com/manual/en/zend.db.select.html#zend.db.select.execute.tostring
Tiare, valeu pelo empenho em mostrar como se faz o debug, assim que sobrar um tempinho vou testar aqui. /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/smile.gif&key=15294d64c22e9e9c4ae0bf82a62ec27d13f27d6ba7078a5f7982077798029364" alt="smile.gif" />
$resultSet = $this->getDbTable()->fetchAll($this->getDbTable()->select('queries.*, MAX(`queries.id`) AS `id2`')->group('userId')->order('id2 DESC')->limit(12));
apresenta o seguinte erro
Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id2' in 'order clause'
Não testei a solução mas pensei uma coisinha aqui...
Ele não encontrou a coluna id2 no banco de dados. E se no order('id2 DESC') eu substituir por ('queries.id DESC') será que ele encontrará?
Você pode debugar a consulta assim:
Zend_Debug::dump($resultSet->__toString());
Uma outra coisa que costuma e quando você vai relacionar sua consulta com outras tabelas, ai você precisa verificar a fk.