Пример #1
0
 /**
  * Prepara um SQL para atualizacao (UPDATE)
  *
  * @param boolean $whereAddOnly Prepara o SQL somente com os parametros definidos com where
  * @author Hugo Ferreira da Silva
  * @link http://www.hufersil.com.br/lumine
  * @return SQL montada para atualizacao
  */
 protected function _updateSQL($whereAddOnly = false)
 {
     $fields = array();
     $values = array();
     $where = array();
     $old = $this->alias();
     $this->alias('');
     $a = $this->alias();
     if (!empty($a)) {
         $a .= '.';
     }
     foreach ($this->metadata()->getFields() as $name => $def) {
         // se setou uma expressa (_updateExpression)
         if (array_key_exists($name, $this->_updateExpressions)) {
             $exp = $this->_updateExpressions[$name];
             // guardamos o valor anterior
             $bkp = $this->{$name};
             // setamos o valor que vais ser feito o binding
             $this->{$name} = $exp['args'];
             $fields[] = $a . $def['column'];
             $values[] = str_replace('?', Lumine_Parser::getParsedValue($this, $exp['args'], $def['type']), $exp['expression']);
             // voltamos o valor anterior
             $this->{$name} = $bkp;
             continue;
         }
         // se o membro existe na classe mas nao esta setado
         if ($this->_checkMemberExistence($name) && !isset($this->{$name})) {
             // se o valor for igual do dataset
             if (!array_key_exists($name, $this->_dataholder)) {
                 // passa para o proximo
                 continue;
             }
         }
         $valor = $this->fieldValue($name);
         // se este campo existir no DataHolder original e o valor for o mesmo
         if (array_key_exists($name, $this->_original_dataholder) && $this->_original_dataholder[$name] == $valor) {
             // nao coloca na lista de atualizacao
             continue;
         }
         $fields[] = $a . $def['column'];
         // $values[] = Lumine_Parser::getParsedValue($this, $this->_dataholder[ $name ], $def['type']);
         $val = $this->getStrictValue($name, $valor);
         $columns[] = $def['column'];
         if (!$val instanceof Lumine_Base) {
             if ($val === '' && !empty($empty_as_null)) {
                 $values[] = 'NULL';
             } else {
                 if (is_null($val)) {
                     $values[] = 'NULL';
                 } else {
                     $valor = Lumine_Parser::truncateValue($def, $valor);
                     $values[] = Lumine_Parser::getParsedValue($this, $valor, $def['type']);
                 }
             }
         } else {
             $valor = Lumine_Parser::truncateValue($def, $val->{$def}['linkOn']);
             $values[] = Lumine_Parser::getParsedValue($this, $valor, $def['type']);
         }
     }
     if (empty($values)) {
         $this->alias($old);
         Lumine_Log::warning('nao foram encontradas alteracoes para realizar o update');
         return false;
     }
     $where_str = '';
     if ($whereAddOnly == true) {
         // para cada condicao em where
         foreach ($this->_where as $i => $item) {
             // tiramos espacos em branco
             $item = trim($item);
             // se iniciar com OR ou AND
             if (preg_match('@^\\b(or|and)\\b@i', $item)) {
                 // somente adicionamos na clausula
                 $where_str .= ' ' . $item;
                 // do contrario
             } else {
                 // o padrao eh AND
                 $where_str .= empty($where_str) ? $item : ' AND ' . $item;
             }
         }
         $where_str = Lumine_Parser::parseSQLValues($this, $where_str);
     } else {
         $pks = $this->metadata()->getPrimaryKeys();
         foreach ($pks as $id => $def) {
             $name = $def['name'];
             $value = $this->fieldValue($name);
             if (!empty($name)) {
                 $where[] = $a . $def['column'] . ' = ' . Lumine_Parser::getParsedValue($this, $value, $def['type']);
             }
         }
         $where_str = implode(' AND ', $where);
     }
     if (empty($where_str)) {
         $this->alias($old);
         throw new Lumine_Exception('nao e possivel atualizar sem definicao de chaves ou argumentos WHERE', Lumine_Exception::ERROR);
     }
     $table = $this->metadata()->getTablename();
     $schema = $this->_getConfiguration()->getOption('schema_name');
     if (!empty($schema)) {
         $table = $schema . '.' . $table;
     }
     $sql = "UPDATE " . $table . " " . $this->alias() . " SET ";
     $valores = array();
     for ($i = 0; $i < count($fields); $i++) {
         $valores[] = $fields[$i] . ' = ' . $values[$i];
     }
     $sql .= implode(', ', $valores);
     $sql .= " WHERE " . $where_str;
     $this->alias($old);
     return $sql;
 }