Continuando as melhorias na utilização da Zend_Db_Table
, do Zend Framework. Outra melhoria a ser feita é nos métodos update()
e delete()
. O que há de comum entre esses dois métodos é que ambos recebem como parâmetro uma ou mais restrições para identificar em que registro a alteração ou exclusão será feita. Sendo que a grande maioria das vezes que você usa esses métodos, o registro é relativo à chave primária da tabela, e mais raramente à alguma outra coluna. Como no exemplo:
$id = $this->_request->getPost('id'); $tbUsuarios = new Usuarios(); // Imaginemos que esses dados vieram de um formulário $dados = array( 'nome' => 'Fulaninho de Tal', 'email' => 'fulaninho@email.com' ); $where = $tbUsuarios->getAdapter()->quoteInto('id = ?', $id); // Vamos atualizar o usuário $tbUsuarios->update($dados, $where); // E agora excluímos $tbUsuarios->delete($where); |
Pra não ter que toda vez montar a restrição para esses métodos, adicionei à minha classe My_Db_Table_Abstract
. métodos de update e delete para um registro específico, onde o parâmetro de restrição é sempre a chave primária. Vejamos:
class My_Db_Table_Abstract extends Zend_Db_Table_Abstract { protected function _filterData(array $data) { /* Permanece a mesma coisa */ } /** * Gera restricoes SQL de acordo com a(s) chave(s) primária(s) * @param String|array $pkey chave(s) primária(s) * [nome_do_campo => valor] * @return String|array SQL where **/ protected function _generateRestrictionsFromPrimaryKeys($pkey) { $where = array(); if (is_array($this->_primary)) { foreach($this->_primary as $key) { if (is_array($pkey)) { $where[] = $this->getAdapter() ->quoteInto($this->_name.'.'.$key . ' = ?', $pkey[$key]); } else { $where = $this->getAdapter() ->quoteInto($this->_name.'.'.$key . ' = ?', $pkey); } } } else { $where = $this->getAdapter() ->quoteInto($this->_name.'.'.$this->_primary . ' = ?', $pkey); } return $where; } public function insert(array $data) { /* Permanece a mesma coisa */ } public function update(array $data, $where) { $data = $this->_filterData($data); return parent::update($data, $where); } /** * Update de um registro único, baseado na chave primária * @param array $data Dados a serem atualizados * @param string|array $pkey Valor da chave primária **/ public function updateRow(array $data, $pkey) { $where = $this->_generateRestrictionsFromPrimaryKeys($pkey); return $this->update($data, $where); } /** * Delete de um registro único, baseado na chave primária * @param string|array $pkey Valor da chave primária **/ public function deleteRow($pkey) { $where = $this->_generateRestrictionsFromPrimaryKeys($pkey); return $this->delete($where); } } |
Veja que o método updateRow()
é uma variação do método update()
, com a diferença de que este recebe apenas o valor da chave primária, assim como o método deleteRow()
. Esse valor pode ser um array
, caso a tabela tenha chave primária concatenada.
O código agora resume-se a:
// para atualizar um usuário $tbUsuarios->updateRow($dados, $id); // para excluí-lo $tbUsuarios->deleteRow($id); |
Nada mais de ficar montando os “wheres” toda vez que for atualizar ou excluir um registro. Agora é só jogar o valor da chave primária lá e pronto.