/** * Efetua um update baseado em clausulas where * * <p>Qualquer parametro depois de $clause sera usado como prepared statement * para atualizacao dos dados. * Caso for usar prepared statement, colocar o alias do objeto como a letra "o" * </p> * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br * @param array $data Dados a serem atualizados * @param string $clause condicao para atualizacao * @return void */ public function updateWhere(array $data, $clause) { $this->obj->reset(); $this->obj->setFrom($data); $this->obj->alias('o'); $args = func_get_args(); array_shift($args); // se a pessoa passou parametros a mais do que a clausula if ($args > 1) { // entao eh prepared statement, chamamos o where com os argumentos call_user_func_array(array($this->obj, 'where'), $args); } else { // NAO eh prepared statement, chamamos o where $this->obj->where($clause); } $this->obj->update(true); }
/** * Permite adicionar um JOIN com uma expressao livre. * * @param Lumine_Base $obj Objeto que sera unido * @param string $expression Expressao que sera utilizada no join * @param string $alias Apelido para a classe que esta sendo unida * @author Hugo Ferreira da Silva * @return Lumine_Base o proprio objeto */ public function joinExpression($obj, $type, $expression, $alias = null) { $type = trim(strtoupper($type)); if (!preg_match('@^(LEFT|LEFT OUTER|INNER|RIGHT|RIGHT OUTER|CROSS)$@', $type)) { throw new Lumine_Exception('Tipo nao suportado: ' . $type, Lumine_Exception::ERROR); } // se indicar o alias if (!is_null($alias)) { $obj->alias($alias); } else { $alias = $obj->alias(); if (empty($alias)) { $alias = $obj->metadata()->getTablename(); } } // pega a lista de join's do objeto que esta sendo unido $list = $obj->_getObjectPart('_join_list'); // reinicia a lista de join's deste objeto reset($this->_join_list); // argumentos extras $args = func_get_args(); array_splice($args, 0, 4); $expression = trim($expression); // remove espacos em branco try { $expression = Lumine_Parser::parsePart($obj, $expression, $args); // faz o parser para certificacao que os campos existem certinho $expression = Lumine_Parser::parseEntityNames($obj, $expression); } catch (Exception $e) { try { $expression = Lumine_Parser::parsePart($this, $expression, $args); // faz o parser para certificacao que os campos existem certinho $expression = Lumine_Parser::parseEntityNames($this, $expression); } catch (Exception $e) { Lumine_Log::warning('Houve um erro na analise da condicao extra'); } } // adiciona a expressao $this->_join[] = sprintf('%s JOIN %s %s ON %s', $type, $obj->metadata()->getTablename(), $alias, $expression); // para cada item na lista do objeto alvo foreach ($list as $ent) { // indica que pode adicionar $add = true; // para cada item na lista deste objeto foreach ($this->_join_list as $this_ent) { // se for a mesma classe e tiver o mesmo alias if ($ent->metadata()->getClassname() == $this_ent->metadata()->getClassname() && $ent->alias() == $this_ent->alias()) { // nao pode fazer o join $add = false; break; } } // se nao puder fazer o join if (!$add) { // pula para o proximo item continue; } // ok pode adicionar $this->_join_list[] = $ent; $this->_join = array_merge($this->_join, $ent->_getStrJoinList()); // faz o where $where = $ent->_makeWhereFromFields(); // se teve condicoes if (!empty($where)) { // inclui neste objeto $this->where($where); } } // deixa a lista unica $this->_join = array_unique($this->_join); return $this; }
/** * Faz o parse de nomes de colunas e tabelas de uma string * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br/ * @param Lumine_Base $obj * @param string $str * @return string */ public static function parseEntityNames(Lumine_Base $obj, $str) { // fazer parse de u.nome (alias + . + nome_do_campo) de cada entidade $list = $obj->_getObjectPart('_join_list'); foreach ($list as $ent) { $a = $ent->alias(); $name = $ent->metadata()->getClassname(); if (!empty($a)) { preg_match_all('@\\b' . $a . '\\b\\.(\\w+)\\b@', $str, $reg); $total = count($reg[0]); for ($i = 0; $i < $total; $i++) { $field = $ent->metadata()->getField($reg[1][$i]); $exp = '@\\b' . $a . '\\b\\.(' . $reg[1][$i] . ')\\b@'; $str = preg_replace($exp, $a . '.' . $field['column'], $str); } } preg_match_all('@\\{' . $name . '\\.(\\w+)\\}@', $str, $reg); $total = count($reg[0]); for ($i = 0; $i < $total; $i++) { $field = $ent->metadata()->getField($reg[1][$i]); if (!empty($a)) { $str = str_replace($reg[0][$i], $a . '.' . $field['column'], $str); } else { $str = str_replace($reg[0][$i], $ent->metadata()->getTablename() . '.' . $field['column'], $str); } } } // encontra por {propriedade} // quando nao especificado, significa que pertence a mesma entidade // chamadora da funcao, por isso nao fazemos loop preg_match_all('@\\{(\\w+)\\}@', $str, $reg); $total = count($reg[0]); for ($i = 0; $i < $total; $i++) { $f = $obj->metadata()->getField($reg[1][$i]); $a = $obj->alias(); if ($a == '') { $a = $obj->metadata()->getTablename(); } $str = str_replace($reg[0][$i], $a . '.' . $f['column'], $str); } return $str; }