/** * 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; }