Ejemplo n.º 1
0
 /**
  * 
  * @link http://www.hufersil.com.br
  * @author Hugo Ferreira da Silva
  * @param array $filters Filtros que serao aplicados
  * @return void
  */
 protected function setFilters(array $filters, array $where = array())
 {
     foreach ($filters as $key => $value) {
         // iremos ignorar valores vazios
         if ($value === '') {
             continue;
         }
         try {
             $target = $this->obj;
             $alias = $this->obj->_getAlias();
             // se indicou o alias
             if (preg_match('@^(\\w+)\\.(\\w+)$@', $key, $reg)) {
                 $list = $this->obj->_getObjectPart('_join_list');
                 // para cada item de classes unidas
                 foreach ($list as $class) {
                     // se encontrar o alias
                     if ($class->_getAlias() == $reg[1]) {
                         $target = $class;
                         $alias = $class->_getAlias();
                         $key = $reg[2];
                         break;
                     }
                 }
             }
             $field = $target->_getField($key);
             // se o valor for nulo
             if (is_null($value)) {
                 // colocamos um IS NULL como condicao
                 $this->obj->where($alias . '.' . $key . ' IS NULL');
                 continue;
             }
             // se o usuario informou uma forma de filtro
             if (array_key_exists($alias . '.' . $key, $where)) {
                 // assim o usuario pode personalizar o filtro
                 $this->obj->where($alias . '.' . $key . ' ' . $where[$alias . '.' . $key], $value);
                 continue;
             }
             // se o valor for array
             if (is_array($value)) {
                 $this->obj->where($alias . '.' . $key . ' IN (?)', $value);
                 continue;
             }
             switch ($field['type']) {
                 case 'char':
                 case 'varchar':
                 case 'text':
                 case 'enum':
                 case 'blob':
                 case 'longblob':
                 case 'tinyblob':
                     $this->obj->where($alias . '.' . $key . ' like ?', $value);
                     break;
                     // se nao for texto, nao fazemos por like
                     // fazemos uma comparacao direta
                 // se nao for texto, nao fazemos por like
                 // fazemos uma comparacao direta
                 default:
                     $this->obj->where($alias . '.' . $key . ' = ?', $value);
             }
         } catch (Exception $e) {
             // quando o campo que a pessoa tentou pegar nao existe
             // eh disparada uma excecao, mas neste caso nao eh um erro
             // por isso capturamos a excecao para que nao de problemas para o usuario
         }
     }
 }