Como utilizar o Zend_Db_Table sem precisar vincular uma entidade de Banco
Quem usa o ZendFramework, provavelmente já passou muita raiva pois ele gera aquela mensagem “simpática”: “A table must have a primary key, but none was found”. Isso se deve ao fato de a classe Zend_Db_Table / Zend_Db_Table_Abstract tentar fazer os mapeamentos de nome da entidade, colunas e chave primária – em suma, efetuar um describe da entidade informada.
Mas há momentos em que o modelo não representa uma entidade do banco. Por exemplo, pode-se usar o modelo para executar uma função, uma procedure ou uma consulta à uma “View” de banco. Trabalhando nessa estrutura, onde o modelo representa os dados persistidos no banco, esse paradigma é quebrado.
O Zend Framework é bastante flexível em vários quesitos; um deles é o quesito mapeamento de dados, é possível sobrescrever algums métodos da classe herdada (Zend_Db_Table / Zend_Db_Table_Abstract). Um desses é o método “_setupPrimaryKey”, responsável por instanciar a chave primária da tabela; metódo, também, responsável por gerar a exceção quando, no mapeamento, não é encontrada a chave primária à partir das colunas buscadas à partir de um describe da tabela. Todo esse processo é executado automaticamente pelo Zend_Db.
Para resolver esse problema, é necessário forçar o mapeamento manual de algumas variáveis utilizadas pela classe “pai”. Nessa situação, foi suficiente forçar a variável “$this->_cols” para um vetor vazio. Adicionalmente, foi informado como vazio o nome da tabela, porém a classe pai define como sendo o nome da Classe filha o valor dessa variável ($this->_name).
Portanto, para trabalhar nessa estrutura, onde o modelo não representa uma entidade no banco basta sobrescrever o método “_setupPrimaryKey”:
public function _setupPrimaryKey() {
$this->_cols = array();
$this->_name = “”;
}