Ejemplo n.º 1
0
 /**
  * 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);
 }
Ejemplo n.º 2
0
 /**
  * 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;
 }
Ejemplo n.º 3
0
 /**
  * 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;
 }