Jaime Neto | desenvolvimento para web

jan/10

30

Melhorando o Zend_Db_Table – Parte 2: Simplificando UPDATE e DELETE


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.

·

No comments yet.

Leave a Reply

<<

>>

Theme Design by devolux.nh2.me